题目链接:
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; }
时间: 2024-10-11 16:10:27