1383 整数分解为2的幂

本文介绍了一个整数N分解为2的幂次方之和的方法及其计数原理,并给出了一种有效的算法实现。对于任何正整数N,文章探讨了如何找出所有可能的分解方式,并通过动态规划方法计算这些方式的数量。

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.youkuaiyun.com/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[n]);
32     return 0;
33 }

 

转载于:https://www.cnblogs.com/zzuli2sjy/p/5931316.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值