Description
给定一个数n,将它分解成2^k的和的形式,求不同的分解数,K>=0。 例如当N=7时,有下面6种划分方法
-
1+1+1+1+1+1+1
-
1+1+1+1+1+2
-
1+1+1+2+2
-
1+1+1+4
-
1+2+2+2
-
1+2+4
Format
Input
一个数字N,N<=1e6
Output
输出结果的最后9位
Samples
输入数据 1
7
Copy
输出数据 1
6
思路
这其实也就是个普通背包问题,和数字的拆分之二差不多,就是要装的东西换成了二的幂而已。
代码见下:
#include<bits/stdc++.h>
using namespace std;
int ee,dd,e,jkj,lll=0,a,ni[120][101],nj[101],nk[101],b[100001],c[54],d[100001],k,kkk,p,ss[100001][51],sd[100001],sw,t,z0,z1,u0,sc,s0,sm,sx;
int n,m=1e9,oo,pe2,as=1,dwd=0,s2[1000101],n4[1000001];
string wss;
int main(){
cin>>n;
s2[1]=1;
n4[0]=1;
for(int i=1;i<=n;i*=2){
//s2[++dwd]=i;
for(int j=i;j<=n;j++){
n4[j]=(n4[j]+n4[j-i])%m;
// cout<<n4[j]<<" ";
}
//cout<<endl;
}
cout<<n4[n]%m<<endl;
return 0;
}