const int maxn = 1e6 + 9;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
ll fac[maxn * 3];
ll inv[maxn * 3];
ll C(ll m, ll n)
{
if (m > n)
return -1;
return fac[n] * inv[m] % mod * inv[n - m] % mod;
}
ll quick_mod(ll n, ll m)
{
ll tmp = n % mod;
ll ans = 1;
while (m)
{
if (m & 1)
ans = ans * tmp % mod;
tmp = tmp * tmp % mod;
m >>= 1;
}
return ans;
}
void init()
{
fac[0] = 1;
for (int i = 1; i <= 5e5; i++)
fac[i] = (fac[i - 1] * i) % mod;
inv[(int)5e5] = quick_mod(fac[(int)5e5], mod - 2);
for (int i = 5e5 - 1; i >= 0; i--)
inv[i] = (inv[i + 1] * (i + 1)) % mod;
}
组合数(逆元)模板
最新推荐文章于 2024-10-09 08:36:38 发布