hdu 4602 Partition 快速幂,构造递推关系
题目地址: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; } } }