#include<bits/stdc++.h> using namespace std; //背包问题求限制条件的方案数,求装满的前提下的方案数(不是最优解也可) //这个题等价于求完全背包的方案数,dp数组表示装满的方案数目,只包括装满了的,这取决于初始值, //如果dp数组表示总方案数,包括没装满的,那么初始值不同 //数组太大使用滚动数组+完全背包的优化 //dp[i][j]=dp[i][j-w]+dp[i-1][j] int n,m,dp[1000000+10],p=1000000000,a[20]; int main() { while(cin >> n){ //10^6最多分解到2^19,则计算背包物品 for(int i=0;i<20;i++){ a[i]=(1<<i); } memset(dp,0, sizeof(dp)); for(int i=0;i<=n;i++) dp[i]=1;//这里0也有1种情况,因为2 4 8等会用到dp[0] for(int i=1;i<20;i++){ for(int j=0;j<=n;j++){ if(j>=a[i]) dp[j]=(dp[j]+dp[j-a[i]])%p; } } cout<<dp[n]<<endl; } return 0; }