Arbitrary Mod Combination

ArbitraryModBinomial computes binomial coefficients n choose k modulo an arbitrary modulus.

It supports composite moduli as well as prime moduli.

Import

import atcoder/extra/math/arbitrary_mod_combination

Example

import atcoder/extra/math/arbitrary_mod_combinationlet binom = initArbitraryModBinomial(1000, 100)doAssert binom.C(20, 10) == 756doAssert binom.C(5, 2) == 10doAssert binom.C(5, 6) == 0

initArbitraryModBinomial

let binom = initArbitraryModBinomial(md, N_MAX)

Initializes a helper for binomial coefficients modulo md.

If md = 1, all results are 0.

C

binom.C(n, k)

Returns n choose k modulo md.

Out-of-range arguments return 0.

doAssert binom.C(5, -1) == 0
doAssert binom.C(5, 6) == 0

Notes

Complexity

The initialization factors md and precomputes data for each prime-power component.
Each C(n, k) evaluates the components and combines them with CRT.