• 1383 整数分解为2的幂


    1383 整数分解为2的幂

    基准时间限制:1 秒 空间限制:131072 KB
    任何正整数都能分解成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
    Input示例
    7
    Output示例
    6

    f(2m+1) = f(2m)   因为奇数整数2m+1的每种分解方式中都必然含有至少一个1,当把每种分解方式都去掉1时,就得到2m的分解方式
    f(2m) = f(2m-1) + f(m)  偶数整数2m的分解方式中可能有1,也可能没有1。如果有1,那一定会有偶数个1。现在把有1和无1分成两部分。先看有1的那部分,当把这部分里每个分解方式都去掉1,就得到2m-1的分解方式
    然后再看无1的那部分,因为没有1,所以所有的分解方式都全是2的倍数,当把这部分里每种分解方式都除以2时,这就相当于全是m的分解方式(转自http://blog.csdn.net/ojshilu/article/details/16344121)
     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<string.h>
     5 #include<stdlib.h>
     6 #include<queue>
     7 #include<set>
     8 #include<vector>
     9 #include<map>
    10 using namespace std;
    11 typedef long long LL;
    12 LL N[1000006];
    13 const LL mod = 1e9+7;
    14 int main(void)
    15 {
    16       N[1] = 1;int i,j;
    17       for(i = 2;i <= 1000000;i++)
    18       {
    19           if(i%2==0)
    20           {
    21               N[i] = N[i-1]+N[i/2];
    22               N[i]%=mod;
    23           }
    24           else
    25           {
    26               N[i] = N[i-1];
    27           }
    28       }
    29     int n;
    30     scanf("%d",&n);
    31     printf("%lld
    ",N[n]);
    32     return 0;
    33 }
    油!油!you@
  • 相关阅读:
    随机生成一份试卷,试卷的种类分为单选、多选、判断三种题型。nodejs6.0 mysql
    git 常用命令
    ECMAScript 继承机制实现
    javascript正则表达式
    利用javascript实现二维数组的筛选
    iframe引入百度地图显示企业位置
    前端开发APP,从HBuilder开始~
    js闭包理解
    Python多线程threading与多线程中join()的用法
    Python中的装饰器
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5931316.html
Copyright © 2020-2023  润新知