題目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4602
解題思路: 1設對n的分解中k出現的次數是 g(n,k) ,首先發現k從n往下舉例的時候,前幾項都是一樣的(待證明)
然後只需要知道對n的劃分中,一共有多少個數。 考慮將n分成k個數,有C(n-1,k-1)種分發,於是總個數就是sigma k*C(n-1,k-1) ;
2 利用kC(n,k)=n C(n-1,k-1) 很容易求和 ,找到了a(n)=sigma...- S(n-1) ;再列舉一項相減就可以了。 最後得到a(n)=(2^(n-3) ) * (n+2),n>=3;
3 輸入n,k 將n-k+1帶入計算就可以了 ,注意特判n-k<0,==1, 幾種情況。
4n,k比較大, 記得使用快速冪,還有使用long long儲存結果;
#include<iostream>using namespace std;typedef long long inta;inta quick_mod(inta a,int b,int m){ inta ans=1; a=a%m; while(b>0) { if(b&1) { ans=(ans*a)%m; } b>>=1; a=(a*a)%m; } return ans;}int main(){ int size; cin>>size; int n,k; while(cin>>n>>k) { int temp=n-k; if(temp<0) cout<<0<<endl; else if(temp==0) cout<<1<<endl; else if(temp==1) { cout<<2<<endl; }// else if(temp==2)// {// cout<<5<<endl;// } else { inta ans=quick_mod(2,temp-2,1000000007); ans=(ans*(temp+3))%1000000007; cout<<ans<<endl; } }}