【题目大意】
把一个数n分成2的指数幂相加的形式,问有几种情况。
【思路】
如果当前i为奇数,则必定有至少一个1,可以看作i-1的情形再加上一个1。即f[i]=f[i-1]。
如果当前i为偶数,假设没有1,则所有数字都可以除以2,相当于f[i/2];如果有1,必定有至少两个1,则等于f[i-2]。即f[i]=f[i/2]+f[i-2]。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int MAXN=1000000+50; 6 int n,f[MAXN]; 7 8 int main() 9 { 10 scanf("%d",&n); 11 f[0]=1; 12 for (int i=1;i<=n;i++) 13 { 14 if (i%2==1) f[i]=f[i-1] % 1000000000; 15 else f[i]=(f[i-2]+f[i/2]) % 1000000000; 16 } 17 cout<<f[n]<<endl; 18 return 0; 19 }