| 571 | } |
| 572 | |
| 573 | fn n_choose_k(n: usize, k: usize) -> Result<usize, String> { |
| 574 | if k > n { |
| 575 | return Err("k cannot exceed n".to_string()); |
| 576 | } |
| 577 | let k_eff = k.min(n - k); |
| 578 | let mut numerator: u128 = 1; |
| 579 | let mut denominator: u128 = 1; |
| 580 | for i in 0..k_eff { |
| 581 | numerator *= (n - i) as u128; |
| 582 | denominator *= (i + 1) as u128; |
| 583 | } |
| 584 | let comb = numerator / denominator; |
| 585 | usize::try_from(comb).map_err(|_| "combination count overflowed usize".to_string()) |
| 586 | } |
| 587 | |
| 588 | fn combinations(n: usize, k: usize) -> Vec<Vec<usize>> { |
| 589 | let mut out = Vec::new(); |