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

 

posted @ 2016-10-04 21:22  sCjTyC  阅读(342)  评论(0编辑  收藏  举报