标签:
题目链接:
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;
}标签:
原文地址:http://blog.csdn.net/lianai911/article/details/44937005