zoukankan      html  css  js  c++  java
  • 整数分解为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;
    }
  • 相关阅读:
    token的时限多长才合适?
    WebFTP安装说明
    维度表和事实表的区别
    互联网产品mysql数据库设计总结
    网络的介数中心性(betweenness)及计算方法
    python中的编码与解码
    增强学习Reinforcement Learning经典算法梳理3:TD方法
    Mybatis 参考
    防御CSRF、XSS和SQL注入攻击
    转:PriorityQueue
  • 原文地址:https://www.cnblogs.com/MATLABlearning001/p/5396995.html
Copyright © 2011-2022 走看看