整数分解为2的幂

来源:互联网 发布:画柜子软件 编辑:程序博客网 时间:2024/06/18 05:06
任何正整数都能分解成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
Sample Input
7
Sample Output

6


思路:

如果一个数是一个奇数,那么他是不是等于前一个数字的组成方式,因为他不可能加上一个最小的2了。

我的意思是,奇数减去前面一个数字,是不是代表着1,不够2,也就是说他的等于前一个数字的组成方式。

而一个数字为偶数,是不是代表着他等于前面一个的组成方式,(因为他前者的组成方式,每一种加上一个1,就是他了。)还要加上谁乘以2就等于他的那个数字的组成方式。(如果不懂你可以写几个就知道了,毕竟我也是写了10个,才知道的规律。)

代码如下:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;ll vis[1000005];ll n;int main(){    while(scanf("%lld",&n)!=EOF)    {        memset(vis,0,sizeof(vis));        vis[0]=1;        for(int i=1; i<=n; i++)        {            if(i&1==1) vis[i] = vis[i-1];            else vis[i] = (vis[i/2]+vis[i-1])%1000000007;        }        printf("%lld\n",vis[n]%1000000007);    }    return 0;}