假设有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) ;
2 1 2 5 2 1 5
3 3HintHint For sample 1, squirrels will put no more than 2 beans in one tree. Since trees are different, we can label them as 1, 2 … and so on. The 3 ways are: put no beans, put 1 bean in tree 1 and put 2 beans in tree 1. For sample 2, the 3 ways are: put no beans, put 1 bean in tree 1 and put 1 bean in tree 2.
#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; }
HDOJ 3037 Saving Beans,布布扣,bubuko.com
原文:http://blog.csdn.net/ck_boss/article/details/38471743