清華機試oj——整數拆分

題目描述

一個整數總可以拆分爲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。
示例1

輸入

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)
發佈了50 篇原創文章 · 獲贊 54 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章