如果您有n+1树,文章n+1埋不足一棵树m种子,法国隔C【n+m】【m】
大量的组合,以取mod使用Lucas定理:
Lucas(n,m,p) = C[n%p][m%p] × Lucas(n/p,m/p,p) ;
Saving Beans Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2314 Accepted Submission(s): 845
Now they turn to you for help, you should give them the answer. The result may be extremely huge; you should output the result modulo p, because squirrels can’t recognize large numbers.
Then followed T lines, each line contains three integers n, m, p, means that squirrels will save no more than m same beans in n different trees, 1 <= n, m <= 1000000000, 1 < p < 100000 and p is guaranteed to be a prime.
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long int LL; LL n,m,p; LL fact[100100]; LL QuickPow(LL x,LL t,LL m) { if(t==0) return 1LL; LL e=x,ret=1LL; while(t) { if(t&1) ret=(ret*e)%m; e=(e*e)%m; t>>=1LL; } return ret%m; } void get_fact(LL p) { fact[0]=1LL; for(int i=1;i<=p+10;i++) fact[i]=(fact[i-1]*i)%p; } LL Lucas(LL n,LL m,LL p) { ///lucas(n,m,p)=c[n%p][m%p]*lucas(n/p,m/p,p); LL ret=1LL; while(n&&m) { LL a=n%p,b=m%p; if(a<b) return 0; ret=(ret*fact[a]*QuickPow((fact[b]*fact[a-b])%p,p-2,p))%p; n/=p; m/=p; } return ret%p; } int main() { int T_T; scanf("%d",&T_T); while(T_T--) { LL n,m,p; cin>>n>>m>>p; get_fact(p); cout<<Lucas(n+m,m,p)<<endl; } return 0; }