整数分解为2的幂
题目十、整数分解为2的幂
任何正整数都能分解成2的幂,给定整数N,求N的此类划分方法的数量!由于方案数量较大,输出Mod 1000000007的结果。
比如N = 7时,共有6种划分方法。
7=1+1+1+1+1+1+1
=1+1+1+1+1+2
=1+1+1+2+2
=1+2+2+2
=1+1+1+4
=1+2+4
Input
输入一个数N(1 <= N <= 10^6)
Output
输出划分方法的数量Mod 1000000007
输入示例
7
100
12345
999999
521
输出示例
6
9828
190220241
395015364
33130918
解题思路:
这一题看上去好烦人,其实真的很烦人。。我和第九题一样也是想了很久我去。最后实在逼急了我就用小学生的方法,找规律来做了。
f(x)表示x的划分数,第一次算到f(9)
f(1) = 1;
f(2) = 1;
f(3) = 2;
f(4) = 4;
f(5) = 4;
f(6) = 6;
f(7) = 6;
f(8) = 10;
f(9) = 10;
我以为规律就是i为偶数时,f( i + 1 ) = f( i ) = f ( i - 1) + f( i - 4),结果发现并不是orz......我就再多试了几组。
f(10) = 14;
f(11) = 14;
哈哈发现了吗,对于i是偶数,f( i + 1 ) = f( i ) = f ( i - 1) + f( i / 2) 试试发现真的是这样,那这题就好运的解了哈哈
代码:
#include <cstdio> #define MAX 1000010 long long dp[MAX]; // 存放f(x)的1数组 int count = 0; void F(int n) { dp[1] = 1ll; // 定义四个非主流的初值 =。= dp[2] = dp[3] = 2ll; dp[4] = dp[5] = 4ll; count = count + 6; // 数组的有效区域 n = n - 5; // 未计算区域 while (n > 0) { dp[count + 1] = dp[count] = (dp[count - 1] + dp[count / 2]) % 1000000007; n -= 2; count += 2; } } int main() { F(MAX); int n; scanf("%d", &n); printf("%d\n", dp[n]); return 0; }