hdu 4602 Partition 快速幂,构造递推关系 (13多校#1,1003)
题目地址: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;
}
}
}
posted on 2013-07-25 23:25 814jingqi的ACM 阅读(122) 评论(0) 收藏 举报
浙公网安备 33010602011771号