题目:http://acm.hdu.edu.cn/showproblem.php?pid=3037
卢卡斯定理模板——大组合数的取模
代码如下:
#include<iostream> #include<cstdio> using namespace std; long long t,n,m,p,a[100005]; long long qpow(long long x,long long y) { if(y==0)return 1; long long ans=1; while(y>0) { if(y%2)ans=ans*x%p;//不能是ans*=x%p; y/=2; x=x*x%p; } return ans; } long long getc(long long n,long long m) { if(n<m)return 0; if(m>n-m)m=n-m; long long s1=1,s2=1; for(int i=1;i<=m;i++) { s2=s2*i%p; s1=s1*(n-i+1)%p; } return s1*qpow(s2,p-2)%p; // return (a[n]*qpow(a[m],p-2))%p*qpow(a[n-m],p-2)%p; } long long lucas(long long n,long long m) { if(m==0)return 1; return getc(n%p,m%p)*lucas(n/p,m/p)%p; } int main() { scanf("%lld",&t); while(t--) { scanf("%lld%lld%lld",&n,&m,&p); // a[0]=1; // for(int i=1;i<=p;i++) // a[i]=a[i-1]*i%p; printf("%lld ",lucas(n+m,n)%p); } return 0; }