您的位置:首页 > 其它

hdu 4602 Partition

2013-07-26 20:44 232 查看
题意:将一个整数 n 进行无序拆分,一共有2^(n-1)种;输入一个整数 k ,问 k 在所有拆分中出现的次数。

分析:a
[k]=a[i][k]+2^(n-k-1);(k<=i<n)


通过归纳法得到 a
[k]=2*a[n-1][k]+2^(n-3);(n>=3),而对所有的 k 都有a[k][k]=1,a[k+1][k]=2,........


所以数组a的值与第二维k无关。那么 a[k]=1,a[k+1]=2,...;令n=n-k+1;即可以表示为 a[1]=1,a[2]=2,...a
=2*a[n-1]+2^(n-3)。


最终得到 a
=2^(n-1)+(n-2)*2^(n-3);将n=n-k+1代入得:a[n-k+1]=2^(n-k)+(n-k-1)*2^(n-k-2)


// Time 78ms; Memory 332K
#include<iostream>
#include<cstdio>
using namespace std;
const int inf=1000000000+7;
long long pow(int n)
{
long long q=1,p=2;
while(n)
{
if(n%2) q=(q*p)%inf;
n/=2;
p=(p*p)%inf;
}
return q;
}
int main()
{
int t,n,k;
long long sum;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
if(n<k) sum=0;
else if(n-k+1==1) sum=1;
else if(n-k+1==2) sum=2;
else sum=(pow(n-k)+((n-k-1)*pow(n-k-2))%inf)%inf;
cout<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM-ICPC C hdu 快速幂 递推