Skip to content

Commit

Permalink
⚡ improves binomial mod performance
Browse files Browse the repository at this point in the history
  • Loading branch information
iagorrr committed Feb 18, 2024
1 parent ef234dd commit 8930eec
Showing 1 changed file with 17 additions and 13 deletions.
30 changes: 17 additions & 13 deletions algorithms/math/binomial-mod.cpp
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit 8930eec

Please sign in to comment.