题目描述:
一个数n~1e6.只能够用2的幂次(1, 2, 4….)来构成,问构成的方法有多少.
原题链接http://poj.org/problem?id=2229
如果i为奇数,肯定有一个1,把f[i-1]的每一种情况加一个1就得到fi,所以f[i]=f[i-1]
如果i为偶数,如果有1,至少有两个,则f[i-2]的每一种情况加两个1,就得到i,如果没有1,则把分解式中的每一项除2,则得到f[i/2]
所以f[i]=f[i-2]+f[i/2]
由于只要输出最后9个数位,别忘记模1000000000
#include<iostream>
using namespace std;
const int Mod=1e9;
int f[1000001];
int main()
{
int i,n;
f[1]=1;
f[2]=2;
for(i=3;i<=1000000;i++)
{
if(i&1)
{
f[i]=f[i-1];
}
else
{
f[i]=f[i-1]+f[i/2];
f[i]%=Mod;
}
}
cin>>n;
cout<<f[n]<<endl;
return 0;
}