Lucas(卢卡斯)定理
|
Lucas定理,是用来快速求解一个组合数对于一个数(保证这一个数是质数)的模。 那么代码实现也十分简单。 #include <cstdio>
#define Maxn 100000
int n,m,p;
int inv[Maxn+5];
int a[Maxn+5];
int ksm(int x,int y){
int ans=1;
while(y){
if(y&1){
ans=(int)((long long)ans*x%p);
}
y>>=1;
x=(int)((long long)x*x%p);
}
return ans;
}//求逆元
int C(int x,int y){
if(y>x){
return 0;
}
return (int)(1ll*a[x]%p*ksm(a[y],p-2)%p*ksm(a[x-y],p-2)%p);
}//求组合数
int lucas(int x,int y){
if(y==0){
return 1;
}
return (int)(lucas(x/p,y/p)*1ll*C(x%p,y%p)%p);
}//lucas,用递归实现极为简单
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&p);
a[0]=1;
for(int i=1;i<=p;i++){
a[i]=(int)(a[i-1]*1ll*i%p);
}//预处理
printf("%dn",lucas(n+m,n));
}
return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
