码迷,mamicode.com
首页 > 其他好文 > 详细

HDU2709 Sumsets【递推】

时间:2015-04-08 10:57:59      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2709


题目大意:

将一个整数N分解成2^i相加的形式,共有多少种分法。例如:7 = 1+1+1+1+1+1+1

 = 1+1+1+1+1+2 = 1+1+1+2+2 = 1+1+1+4 = 1+2+2+2 = 1+2+4,共有6种分法。


思路:

设a[n]为整数n分解成2^i相加形式的分法个数。

当n为奇数时,n-1为偶数,n = 1 + n-1,分解出一个1,再分解偶数n-1,也就是a[n-1]种分法。

当n为偶数时,有两种分解方法。

1):相加的2^i中含有1。因为n为偶数,所以至少有两个1,即n = 1 + 1 + n-2,则总数为a[n-2]。

2):相加的2^i中不含1。分解的因子都是偶数,将每个分解的2^i都除以2,刚好是n/2的分解结果,

总数为a[n/2]。

总结起来就是:

如果n为奇数,a[n] = a[n-1],如果n为偶数,a[n] = a[n-2] + a[n/2]。这是一个递推过程。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

__int64 a[1000100];

int main()
{
    a[0] = 1,a[1] = 1;
    for(int i = 2; i <= 1000000; ++i)
    {
        if(i&1)
            a[i] = a[i-1];
        else
            a[i] = (a[i>>1] + a[i-2])%1000000000;
    }
    __int64 N;
    while(cin >> N)
    {
        cout << a[N] << endl;
    }

    return 0;
}


HDU2709 Sumsets【递推】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/44937005

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!