整数分解为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
", dp[n]);
    return 0;
}
原文地址:https://www.cnblogs.com/MATLABlearning001/p/5396995.html