題目描述
一個整數總可以拆分爲2的冪的和,例如:
7=1+2+47=1+2+2+27=1+1+1+47=1+1+1+2+27=1+1+1+1+1+27=1+1+1+1+1+1+1總共有六種不同的拆分方式。再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2。用f(n)表示n的不同拆分的種數,例如f(7)=6.要求編寫程序,讀入n(不超過1000000),輸出f(n)%1000000000。
輸入描述:
每組輸入包括一個整數:N(1<=N<=1000000)。
輸出描述:
對於每組數據,輸出f(n)%1000000000。
輸入
7
輸出
6
解題思路
設n的劃分數是f(n),則有狀態轉移方程:
i是奇數:f[i]=f[i-1](把f[i]每一種劃分中去掉一個1,就得到f[i-1])
i是偶數:f[i]=f[i-1]+f[i/2] 其中f[i-1]表示拆分有1的種數,f[i/2]表示拆分沒有1的種數。
代碼實現
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int f[1000001];
ll func(ll n){
for(ll i = 1; i <= n; i++){
if(i == 1)
f[i] = 1;
else if(i % 2)
f[i] = f[i-1];
else
f[i] = (f[i-1] + f[i/2]) % 1000000000;
}
return f[n];
}
int main(){
ll n;
while(cin >> n){
cout << func(n) << endl;
}
return 0;
}
繼續加油吧!ヾ(◍°∇°◍)ノ゙(好睏zzZZ)