求单组但较大组合数时,用卢卡斯
LL quick_mod(LL a, LL b)
{
LL ans = 1;
a %= p;
while(b)
{
if(b & 1)
{
ans = ans * a % p;
b--;
}
b >>= 1;
a = a * a % p;
}
return ans;
}
LL C(LL n, LL m)
{
if(m > n) return 0;
LL ans = 1;
for(int i=1; i<=m; i++)
{
LL a = (n + i - m) % p;
LL b = i % p;
ans = ans * (a * quick_mod(b, p-2) % p) % p;
}
return ans;
}
LL Lucas(LL n, LL m)
{
if(m == 0) return 1;
return C(n % p, m % p) * Lucas(n / p, m / p) % p;
}
求多组但较小组合数时,用阶乘+逆元
LL C(LL n, LL m)
{
LL ans;
if(n<m)
return 0;
ans = jc[n]*inv[m]%mod*inv[n-m]%mod;
return ans;
}
for(i=1;i<=100001;i++)
jc[i] = (jc[i-1]*i)%mod;
inv[100001] = Pow(jc[100001], mod-2);
for(i=100000;i>=1;i--)
inv[i] = inv[i+1]*(i+1)%mod;