#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int M =101000000;
int dp[M]; //dp[n] n的分解方法数
// n是奇数 : 肯定有1个1 还差n-1 <->dp[n-1]
//n如果是偶数 则 1的个数 两种可能 :0个1 dp[n/2]的每个构成数都*2 2*(x1+x2+..)=2*(n/2)
// 至少两个1 dp[n-2] 每个构成数都加上两个1
int main()
{
long n;
dp[1]=1;
dp[2]=2;
for(int i=3;i<=1000010;i++)
{
if(i%2)
{
dp[i]=dp[i-1];
}
else
{
dp[i]=dp[i/2]+dp[i-2];
}
dp[i]=dp[i]%1000000000;
}
cin>>n;
cout<<dp[n]%1000000000;
return 0;
}
POJ 2229 Sumsets 递推
最新推荐文章于 2017-02-26 11:03:14 发布