递推即可,设n可表示成dp[n]种二次幂的方式,则有
1.当n为奇数时,显然必定有一个1,故dp[n]=dp[n-1];
2.当n为偶数时,有2种情况
(1)分解的二次幂和中含有1,则必然有2个1,故有dp[n]+=dp[n-2];
(2)分解的二次幂和中不含1,则有dp[n]+=dp[n>>1];
#include<iostream>
using namespace std;
const int maxn=1000005;
const int MOD=1e9;
int dp[maxn];
int main()
{
dp[0]=dp[1]=1;
int n; cin>>n;
for(int i=2;i<=n;++i)
if(i&1) dp[i]=dp[i-1];
else dp[i]=(dp[i-2]+dp[i>>1])%MOD;
cout<<dp[n]<<endl;
}