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)
分析: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; }
相关文章推荐
- HDU 4602 Partition (快速幂+思维)
- HDU 4602 - Partition
- 【HDU 4602】Partition
- [HDU 4602]Partition[划分]
- 2013 多校第一场 hdu 4602 Partition
- hdu 4602 Partition (概率方法)
- hdu 4602 Partition(矩阵快速幂乘法)
- HDU 4602 Partition
- hdu 4602 Partition
- hdu 4602 Partition
- HDU 4602 Partition (矩阵快速幂或求通项)
- HDU 4602 Partition (整数拆分&找规律&快速幂取模)
- HDU 4602 Partition(快速幂)
- HDU 4602 Partition
- HDU 4602 Partition
- hdu-4602-Partition(矩阵快速幂)
- HDU 4602 Partition
- 【五边形定则应用2】HDU 4602——Partition
- hdu-4602-Partition
- hdu 4602 Partition (概率方法)