如果i为奇数,肯定有一个1,把f[i-1]的每一种情况加一个1就得到fi,所以f[i]=f[i-1]
如果i为偶数,如果有1,至少有两个,则f[i-2]的每一种情况加两个1,就得到i,如果没有1,则把分解式中的每一项除2,则得到f[i/2]
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int f[1000005];
int main()
{
int N=0,i=0;
scanf("%d",&N);
f[1]=1;
f[2]=2;
for(i=3;i<=1000000;i++)
{
if(i%2)
{
f[i]=f[i-1];
}
else
{
f[i]=f[i-1]+f[i/2];
f[i]=f[i]%1000000000;
}
}
printf("%d\n",f[N]);
return 0;
}
所以f[i]=f[i-2]+f[i/2]