组合数2: 时间复杂度:O(n * log n)
作者:
啦啦啦123
,
2021-04-06 21:13:32
,
所有人可见
,
阅读 420
组合数方式2:
时间复杂度:o(n * log n) // n 为c[a][b] 中 max(a,b)
方式原理:
c[a][b] = a! / 【(b!) * (a - b)!】 % mod;
方式2代码实现:
1.预处理出f[1~a] , inf[1~b] , inf[1 ~ (a - b)] ;
f[i]为 i!的值 inf[i] 为 i!的逆元 , 也就是 1 / (i!) % mod;
int qmi(int i , int k , int mod) //快速幂求逆元
{
int res = 1;
while(k)
{
if(k & 1)
{
res = (long long)res * i % mod;
}
k >>= 1;
i =(long long)i * i % mod;
}
}
f[0] = inf[0] = 1;
for(int i = 1 ; i <= a ; i++) //a >= b > a - b
{
f[i] = (long long)f[i - 1] * i % mod;
inf[i] = (long long)inf[i - 1] * qmi(i , mod - 2 , mod) % mod;
}
while(n--)
{
int a,b;
c[a][b] = (long long)f[a] * inf[b] % mod * inf[a - b] % mod;
}