1. 程式人生 > >51nod 1383 整數分解為2的冪(遞推)

51nod 1383 整數分解為2的冪(遞推)

Description

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

解題思路

記ans[i]為N=i時的劃分方法,當i為奇數時,ans[i]=ans[i-1],即在ans[i-1]的每一種劃分方法中新增一個1;則當i為偶數時,總的劃分方法包括包含1的劃分方法數即ans[i-1]+不包含1的劃分方法數ans[i/2](將ans[i-1]所有劃分種類中的數*2即為ans[i]不包含1的劃分的所有情況)。

程式碼實現

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
#define maxn 1000007
int ans[maxn];
int main()
{
    int n;
    cin>>n;
    ans[1]=1;
    for(int i=2;i<=n;i++)
        ans[i]=(ans[i-1]+ans[(i/2)]*(!(i%2)))%mod;
    cout<<ans[n]<<endl;
    return 0;
}