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