templates/binomial-coefficients.cpp
compilable
$cat templates/binomial-coefficients
Binomial Coefficients
Precomputed factorial and inverse factorial for O(1) nCr and nPr queries modulo a prime.
#binomial#nCr#nPr#factorial#combinatorics
Log in to track progress, save custom versions, and organize into collections.Log In
$cat source_code/
cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll MOD = 1e9 + 7;
const int MAXN = 2e6 + 5;
ll fact[MAXN], inv_fact[MAXN];
ll power(ll base, ll exp, ll mod) {
ll res = 1; base %= mod;
while (exp > 0) {
if (exp & 1) res = res * base % mod;
base = base * base % mod;
exp >>= 1;
}
return res;
}
void initFact() {
fact[0] = 1;
for (int i = 1; i < MAXN; i++)
fact[i] = fact[i - 1] * i % MOD;
inv_fact[MAXN - 1] = power(fact[MAXN - 1], MOD - 2, MOD);
for (int i = MAXN - 2; i >= 0; i--)
inv_fact[i] = inv_fact[i + 1] * (i + 1) % MOD;
}
ll nCr(ll n, ll r) {
if (r < 0 || r > n) return 0;
return fact[n] % MOD * inv_fact[r] % MOD * inv_fact[n - r] % MOD;
}
ll nPr(ll n, ll r) {
if (r < 0 || r > n) return 0;
return fact[n] % MOD * inv_fact[n - r] % MOD;
}36 linesutf-8
$cat explanation_notes.md
notes_viewer --renderedmarkdown (math enabled)
Binomial Coefficients
Precompute factorials and inverse factorials for modular queries.
Formula
Using Fermat's little theorem: for prime .