package main
import (
"fmt"
)
/*
binomialCoefficient(n, k):
Computes "n choose k" using the multiplicative formula:
C(n, k) = product(i = 1..k) of (n - k + i) / i
Why this method?
- Avoids huge factorials (37! is far too large for 64‑bit integers)
- Keeps intermediate values small and exact
- Efficient, clean, and idiomatic Go
Returns:
The binomial coefficient as uint64.
*/
func binomialCoefficient(n, k uint64) uint64 {
if k > n {
return 0
}
// Use symmetry: C(n, k) == C(n, n-k)
if k > n-k {
k = n - k
}
result := uint64(1)
for i := uint64(1); i <= k; i++ {
result = result * (n - k + i) / i
}
return result
}
func main() {
var mainN uint64 = 37
var mainK uint64 = 6
var powerN uint64 = 7
var powerK uint64 = 1
mainCombos := binomialCoefficient(mainN, mainK)
powerCombos := binomialCoefficient(powerN, powerK)
total := mainCombos * powerCombos
fmt.Println("Main combinations (C(37,6)):", mainCombos)
fmt.Println("Power combinations (C(7,1)):", powerCombos)
fmt.Println("Total lottery combinations:", total)
}
/*
run:
Main combinations (C(37,6)): 2324784
Power combinations (C(7,1)): 7
Total lottery combinations: 16273488
*/