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
輸入一個數N(1 <= N <= 10^6)
輸出劃分方法的數量Mod 1000000007

Solution

這題其實真的很水,真的。

1很特殊,特殊的東西特殊搞。

這題觀察一下題目,好像可以遞推一下。

設方案數為f

[i]

觀察等式,發現1很特殊,特殊的東西特殊搞。
劃分方法要麼有1,要麼沒有1,也就是全是偶數。

有1,那就顯然可以從f[i1]轉移而來,每個加上1就變成了i
沒有1,那就全是偶數嘛,全是偶數那就可以全部除個2嘛,於是又可以從f[i/2]轉移而來(當然奇數是沒有的)

所以f[i]=f[i1]+f[i/2]

然後?沒有然後了。

Code

就這麼短……

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fod(i,a,b) for(int i=a;i>=b;i--) #define N 1000005 #define mo 1000000007 using namespace std; int n,m,f[N]; int main() { cin>>n; f[1]=1; fo(i,2,n) { if(i%2==0) f[i]=(f[i-1]+f[i/2])%mo; else f[i]=f[i-1
]; } cout<<f[n]; }