51nod 1383 整數分解為2的冪(數列,也可以自己根據觀察找規律推理得到遞推公式)
阿新 • • 發佈:2018-12-14
描述:
1383 整數分解為2的冪
- 1 秒
- 131,072 KB
- 80 分
- 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-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; }