采用阶乘逆元的相关知识,可以在预处理阶乘后以O(1)查询组合数,其中,p必须是一个质数

1
2
3
4
5
6
7
8
9
int C(int x,int y){
return 1ll*jc[x]*njc[y]%p*njc[x-y]%p;
}
for(int i=0;i<2;i++)jc[i]=njc[i]=inv[i]=1;//阶乘,阶乘逆元,逆元
for(int i=2;i<=100001;i++){
jc[i]=1ll*jc[i-1]*i%p;
inv[i]=1ll*inv[p%i]*(p-p/i)%p;
njc[i]=1ll*njc[i-1]*inv[i]%p;
}