1. 程式人生 > >51nod 1383 整數分解為2的冪(數列,也可以自己根據觀察找規律推理得到遞推公式)

51nod 1383 整數分解為2的冪(數列,也可以自己根據觀察找規律推理得到遞推公式)

描述:

組合數學生成函式

1383 整數分解為2的冪

  1. 1 秒
  2.  
  3. 131,072 KB
  4.  
  5. 80 分
  6.  
  7. 5 級題

任何正整數都能分解成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

 收起

輸入

輸入一個數N(1 <= N <= 10^6)

輸出

輸出劃分方法的數量Mod 1000000007

輸入樣例

7

輸出樣例

6

//這個問題與OEIS中的一個數列相關聯,數列的序號是A018819

可以通過找規律推理得出遞推公式:

f[0]=1;

當n%2==1時,可得f(n)=f(n-1)

當n%2==0時,遞推公式為:f(n)=f(n-1)+f(n/2);

即分為 在f(n-1)的基礎上加上1與 全為2的倍數的情況 即為f(n/2) 

/*
1383
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define ll long long
const int N=1e6+10;
const int mod=1e9+7;
int f[N];
void init()
{
    f[0]=1;
    for(int i=1;i<N;i++)
    {
        if(i%2)
            f[i]=f[i-1];
        else
            f[i]=(f[i-1]+f[i>>1])%mod;
    }
}
int main()
{
    init();
    int n;
    while(scanf("%d",&n)==1)
    {
        printf("%d\n",f[n]);
    }
    return 0;
}