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.
lucas定理模板题。
ans=c(n,1)+c(n+1,2)+....c(n+m-1,m)
根据c(n+1,m)=c(n,m)+c(n,m-1),ans=c(n+m,m)然后套用Lucas模板
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <cmath> #define LL long long using namespace std; int T; LL fac[100005],n,m,p; LL Powmod(LL a,LL b,LL p) //费马小定理求逆元 { LL ans=1LL,now=a; while (b) { if (b&1) ans=(ans*now)%p; b>>=1; now=(now*now)%p; } return ans; } LL Lucas(LL n,LL m,LL p) { LL ans=1LL; while (n&&m) { LL a=n%p,b=m%p; if (a<b) return 0; ans=(ans*fac[a]*Powmod(fac[b]*fac[a-b]%p,p-2,p))%p; n/=p; m/=p; } return ans; } void Getfact(LL p) { fac[0]=1LL; for (int i=1;i<=p;i++) fac[i]=(fac[i-1]*(LL)i)%p; } int main() { scanf("%d",&T); while (T--) { scanf("%lld%lld%lld",&n,&m,&p); Getfact(p); printf("%lld\n",Lucas(n+m,m,p)); } return 0; }
感悟:
Lucas定理就是Lucas(n,m,p)=Lucas(n/p,m/p,p)*C(n%p,m%p)
但是证明的最后一句没看懂!!
原文地址:http://blog.csdn.net/regina8023/article/details/42217545