Sumsets POJ - 2229

题意:给一个数,将其进行分解,只能分解为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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值