求解组合数比较基本的三种方法
ll qmi(ll a,int b)
{
a%mod;
ll res=1;
while(b)
{
if(b&1)res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
for(int i=1;i<=n;i++)
{
C[i][i]=1;
C[i][0]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;i<=n;j++)
{
C[j][i]=C[j-1][i-1]+C[j-1][i];
}
}
(常用
fact[0]=infact[0]=1;
for(int i=1;i<n;i++)
{
fact[i]=(ll)fact[i-1]*i%mod;
infact[i]=(ll)infact[i-1]*qmi(i,mod-2,p)%mod;
}
卢卡斯定理
若p是质数,则对于任意整数 1 <= m <= n,有:
C(n, m) = C(n % p, m % p) * C(n / p, m / p) (mod p)
int C(int a,int b,int P)
{
if(a<b)return 0;
ll x=1;
ll y=1;
for(int i=a,j=1;j<=b;j++,i--)
{
x=(ll)x*i%p;
y=(ll)y*j%p;
}
return x*(ll)qmi(y,p-2,p)%p;
}
int lucas(ll a,ll b,int p)
{
if(a<p&&b<p)return C(a,b,p);
return (ll)C(a%p,b%p,p)*lucas(a / p, b / p, p) % p;
}