题意:给一个数,将其进行分解,只能分解为2的幂次,最多能分解多少种。
分析:对于奇数n,F(n)与F(n-1)只有一个1的差别,所以n的最大分解种一定和n-1相同。
对于偶数m,F(m)由两种类型的组合组成,一部分是不包含1的组合(不包含1时的种类就等于F(m/2)的种类数,因为此时的队列的所有元素都除以2的话就是F(m/2)的组合)
收获:向前寻找相关性的技巧,dp的省时。
#include<stdio.h>
unsigned long long number[1000005];
void get_number()
{
number[0]=0;
number[1]=1;
number[2]=2;
number[3]=2;
for(int i=4;i<1000005;i++)
{
if(i%2==0)
{
number[i]=(number[i-2]+number[i/2])%1000000000;
}
if(i%2==1)
{
number[i]=number[i-1]%1000000000;
}
}
return ;
}
int main ()
{
get_number();
int n;
scanf("%d",&n);
printf("%lld",number[n]);
return 0;
}