牛客網計算機考研複試 KY8 整數拆分

2022-05-26 16:42:10 字數 1501 閱讀 9947

點這裡題目描述:

乙個整數總可以拆分為2的冪的和,例如: 7=1+2+4 7=1+2+2+2 7=1+1+1+4 7=1+1+1+2+2 7=1+1+1+1+1+2 7=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。

思路:

使用動態規劃的思想,最終得到**中的兩個式子,

f(2m+1) = f(2m)

f(2m) = f(2m-1)+f(m)

思路:通過遞推公式,劃分為子問題求解。

問題:乙個整數拆分為2的冪的和。即(1, 2, 2^2, 2^3,..., 2^k),包含1個奇數和k個偶數。

對於n,分為兩種情況:

1)n為奇數(2m+1),則每個拆分結果必然至少有乙個1,因為只通過k個偶數無法組成奇數。所以f(2m+1) = f(2m)

例如 f(5) 1+(4) 1+(2+2) 1+(1+1+2) 1+(1+1+1+1+1)

f(4) 4 2+2 1+1+2 1+1+1+1+1

2) n為偶數(2m),拆分同樣分為兩類:拆分結果中包含1和拆分結果不包含1

a) 拆分結果包含1 (奇拆分):所有的拆分數目為f(2m-1),同上

b) 拆分結果不包含1(偶拆分):拆分數目為f(m)。 拆分結果不包含1,說明是拆分成了k個偶數,那麼對每一種拆分結果都除以2,並不會影響整體拆分的數目。但是每個拆分結果的sum都變成了m,即每個2m的偶拆分都變成了m的拆分。同樣對m的每種拆分結果都乘以2,拆分結果的sum都變成了2m且不包含1。即m的拆分和2m的偶拆分一一對應。

例如f(8) (不包含1的拆分有四種) 8 4+4 2+2+4 2+2+2+2

f(4)(所有拆分有四種) 4 2+2 1+1+2 1+1+1+1

f(2m) = f(2m-1) + f(m)

綜上所述:

f(2m+1) = f(2m)

f(2m) = f(2m-1) + f(m)

**:

#include using namespace std;

const int mod = 1e9;

const int maxn = 1e6+2;

int f[maxn];

int main()

while(cin >> n)

return 0;

}

牛客網計算機考研複試 KY30 進製轉換

點這裡題目描述 將乙個長度最多為30位數字的十進位製非負整數轉換為二進位制數輸出。思路 模擬十進位制轉為二進位制的過程,用string儲存該數,遍歷這個string,每次保留模2的數,然後除2就行。如十進位制123 十進位制 除二 模二 123 61 1 061 30 1 030 15 0 015 ...

牛客網計算機考研複試 KY3 約數的個數

點這裡題目描述 輸入n個整數,依次輸出每個數的約數的個數 思路1 對每乙個數計算其公約數,遍歷1到sqrt n 之間的數。1 include using namespace std int main cout cnt endl return 0 思路2 當n非常大的時候,第一種方法顯然會超時,這時我...

牛客網計算機考研複試 KY9 成績排序

點這裡題目描述 用一維陣列儲存學號和成績,然後,按成績排序輸出。思路 對結構體排序就行了。這裡自己第一遍寫的犯了乙個錯,對把學號id定義為了string型別,在排序的時候導致了錯誤,因為字串比較的時候是從左到右按照ascii碼比較,當比較 13 和 9 的時候,反而 9 13 所以如果題目裡的學生i...