https://www.nowcoder.com/practice/376537f4609a49d296901db5139639ec?tpId=40&tqId=21339&tPage=1&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking
有递推关系
当n=2k+1为奇数时,f(2k+1)=f(2k)。差别在于奇数多一个1
当n=2k为偶数时,分为有1和没有1的拆分。
若有1,则前2项均为1,就和2k-2的拆分一样了。
若没有1,则将每项除以2,就和k的拆分一样了。
故有f(2k)=f(2k-2)+f(k);
#include <iostream>
using namespace std;
const long long mod=1000000000;
int dp[1000001];
long f(long n)
{
for(long i=1;i<=n;i++)
{
if(i==1)
dp[i]=1;
else if(i%2)
dp[i]=dp[i-1];
else
dp[i]=(dp[i-1]+dp[i/2])%mod;
}
return dp[n];
}
int main()
{
int n;
while(cin>>n)
cout<<f(n)<<endl;
return 0;
}