diff --git a/algorithms/math/binomial-mod.cpp b/algorithms/math/binomial-mod.cpp index 4b064ad6..423faa41 100644 --- a/algorithms/math/binomial-mod.cpp +++ b/algorithms/math/binomial-mod.cpp @@ -1,22 +1,26 @@ const ll MOD = 1e9 + 7; -const ll maxn = 2 * 1e6; -vll fats(maxn + 1, -1); +const ll MAXN = 1'00'000; +ll FACT[MAXN + 1]; void precompute() { - fats[0] = 1; - for (ll i = 1; i <= maxn; i++) { - fats[i] = (fats[i - 1] * i) % MOD; + #warning Remember to call precompute before use binommod ! + FACT[0] = 1; + for (ll i = 1; i <= MAXN; i++) { + FACT[i] = (FACT[i - 1] * i) % MOD; } } -ll fpow(ll a, ll n, ll mod = LLONG_MAX) { - if (n == 0ll) return 1ll; - if (n == 1ll) return a; - ll x = fpow(a, n / 2ll, mod) % mod; - return ((x * x) % mod * (n & 1ll ? a : 1ll)) % mod; +ll fpow(ll a, ll k) { + ll ret = 1; + while (k) { + if (k & 1) ret = (ret * a) % MOD; + a = (a * a) % MOD; + k >>= 1; + } + return ret; } ll binommod(ll n, ll k) { - ll upper = fats[n]; - ll lower = (fats[k] * fats[n - k]) % MOD; - return (upper * fpow(lower, MOD - 2ll, MOD)) % MOD; + ll upper = FACT[n]; + ll lower = (FACT[k] * FACT[n - k]) % MOD; + return (upper * fpow(lower, MOD - 2ll)) % MOD; }