const int MOD = 1e9 + 7;
const int lim = 2e6 + 10;
int fc[lim], rfc[lim];
int qp(int x,int p = MOD - 2)
{
int res = 1;
while (p)
{
if (p & 1) res = 1ll * res * x % MOD;
p >>= 1;
x = 1ll * x * x % MOD;
}
return res;
}
void init()
{
fc[0] = 1;
for (int i = 1; i < lim; ++i)
fc[i] = 1ll * fc[i - 1] * i % MOD;
rfc[lim - 1] = qp(fc[lim - 1]);
for (int i = lim - 1; i > 0; --i)
rfc[i - 1] = 1ll * rfc[i] * i % MOD;
}
int C(int n,int m)
{
if (n < 0 || m > n || m < 0) return 0;
return 1ll * fc[n] * rfc[m] % MOD * rfc[n - m] % MOD;
}
int A(int n,int m)
{
if (m > n || n < 0) return 0;
return 1ll * fc[n] * rfc[n - m] % MOD;
}
线性组合数板子
于 2022-05-19 21:09:43 首次发布