1. 程式人生 > >HDU 5201 The Monkey King(組合數學)(隔板法+容斥定理+費馬小定理)

HDU 5201 The Monkey King(組合數學)(隔板法+容斥定理+費馬小定理)

逆元 cst 大於 ont amp space pro http strong

http://acm.hdu.edu.cn/showproblem.php?pid=5201
題意:給你n個桃子要你分給m只猴子,猴子可以得0個桃子,問有多少種方法,但是有一個限制條件: 第一只猴子分得的桃子數量一定大於其他猴子的桃子數。

思路:首先部門不考慮限制條件,那麽這個問題就非常簡單了,n個物品分成m組,允許某些組為空(這不就是隔板法嗎!~~~!),簡單答案就是組合:C(n+m-1,m-1);

現在我們來考慮限制條件,由於至少k只猴子的桃子數大於第一只猴子的桃子數比較好算,假設第一只猴子得到了x個桃子,那麽在剩下的m-1只猴子中選取 k只猴子也得到x個桃子,這個方法數為:C(m-1,k),

還剩下t=n-(x+1)*k個桃子,把它分給除第一只猴子外的m-1猴子,C(t+m-1,m-2);利用容斥定理可以得到最後的答案=總答案-至少一只猴子的桃子數大於第一只猴子+至少兩只猴子的桃子數大於第一只猴子-....+....

註意:組合數裏面的n,m比較大,求階乘的時候不好算,可以使用費馬小定理先預處理了這些階乘!a^(p-2)=a^-1(mod p) (p為素數)。

參考:http://blog.csdn.net/tc_to_top/article/details/48579971

 1 #include<cstdio>
 2 #include<algorithm>
 3
#include<queue> 4 using namespace std; 5 typedef long long ll; 6 const int mod=1e9+7; 7 const int maxn=2e5+10; 8 9 int n,m; 10 ll fz[maxn];///分子的階乘 11 ll fm[maxn];///(分母的階乘)使用費馬小定理求出分母的逆元 12 ///C(x,y)=fz[x]*fm[y]*fm[x-y]; 13 ll Q_pow(ll x,ll y)///x^y 14 { 15 ll cnt=1; 16 while(y)
17 { 18 if(y&1) 19 cnt=cnt*x%mod; 20 x=x*x%mod; 21 y>>=1; 22 } 23 return cnt%mod; 24 } 25 void init() 26 { 27 fz[0]=fz[1]=1; 28 fm[0]=fm[1]=1; 29 for(int i=2;i<maxn-1;i++) 30 { 31 fz[i]=i*fz[i-1]%mod; 32 fm[i]=Q_pow(fz[i],mod-2);///費馬小定理(P為素數):a^(p-2)=a^-1(mod p) 33 } 34 } 35 ll C(int x,int y)///組合數C(x,y) 36 { 37 return fz[x]*fm[y]%mod*fm[x-y]%mod; 38 } 39 ll solve(int x)///第一只猴子得到的桃子數為x 40 { 41 if(x==n) 42 return 1; 43 int k=0; 44 int t; 45 ll ans=0; 46 while(1) 47 { 48 if(k>m-1) 49 break; 50 t=n-(k+1)*x;///剩余桃子數 51 if(t<0)///剩余桃子數肯定不能小於0 52 break; 53 ll cnt=C(m-1,k)*C(t+m-2,m-2)%mod; 54 if(k&1)///k%2==1 55 ans=(ans+mod-cnt)%mod; 56 else 57 ans=(ans+cnt)%mod; 58 k++; 59 } 60 return ans; 61 } 62 int main() 63 { 64 int t; 65 scanf("%d",&t); 66 init(); 67 while(t--) 68 { 69 scanf("%d %d",&n,&m); 70 if(m==1) 71 { 72 printf("1\n"); 73 continue ; 74 } 75 ll ans=0; 76 for(int i=1;i<=n;i++) 77 ans=(ans+solve(i))%mod; 78 printf("%lld\n",ans); 79 } 80 return 0; 81 }

HDU 5201 The Monkey King(組合數學)(隔板法+容斥定理+費馬小定理)