一、题意:给定一个数n,将它分解成2^i的和的形式,求不同的分解数。
二、思路:poj崩了,暂时不能确定思路是否正确。
三、代码:
#include"iostream" #include"stdio.h" #include"math.h" using namespace std; const int MAXN=1000005; const long long MOD=1000000000; int dp[2][MAXN]; int num; void GetRes(int n) { num=floor(log2(n))+1; for(int i=0;i<num;i++) dp[i&1][0]=1; for(int j=1;j<=n;j++) dp[0][j]=0; for(int i=0;i<num;i++) { for(int j=1;j<=n;j++) { if(j-pow(2,i)>=0) dp[(i+1)&1][j]=(dp[(i+1)&1][j-int(pow(2,i))]+dp[i&1][j])%MOD; else dp[(i+1)&1][j]=dp[i&1][j]%MOD; } } cout<<dp[num&1][n]<<endl; } int main() { int n; while(scanf("%d",&n)==1) { GetRes(n); } return 0; }