把给出的数字分解成2的幂相加的形式,问有多少种组成。
如果i为奇数,肯定有一个1,把dp[i-1]的每一种情况加一个1就得到fi,所以dp[i]=dp[i-1]
如果i为偶数,如果有1,至少有两个,则dp[i-2]的每一种情况加两个1,就得到i,如果没有1,则把分解式中的每一项除2,则得到dp[i/2]
所以dp[i]=dp[i-2]+dp[i/2]。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <vector>
#include <set>
#define inf (1<<29)
using namespace std;
int n;
int dp[1000001];
int main()
{
dp[1]=1;dp[2]=2;
for(int i=3;i<=1000000;i++)
{
if(i&1)
{
dp[i]=dp[i-1];
}
else
{
dp[i]=dp[i-1]+dp[i/2];
dp[i]%=1000000000;
}
}
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",dp[n]);
}
return 0;
}