九度OJ 1084 整數拆分

2021-07-16 06:32:04 字數 1188 閱讀 5222

題目描述:乙個整數總可以拆分為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。

輸入:每組輸入包括乙個整數:n(1<=n<=1000000)。

輸出:對於每組資料,輸出f(n)%1000000000。

樣例輸入:

7

樣例輸出:

6

這道題技巧性非常強,就是列出前幾個的值,然後找規律。

當n為奇數時,只是在前乙個偶數的基礎上加了個1,所以對於拆分數並沒有影響,所以f(n) = f(n-1)

當n為偶數時,有兩種情況,一種是包含1的,另一種是不包含1的。前一種和f(n-1)是類似的,後一種情況,把每個數都除以2,是不是就是f(n/2),舉個例子,8 的拆分數除了包含1的,也就是在7的拆分數基礎上,在每個式子右邊加個1.還包括另一種情況:

不包含1的,這種情況類似於4的拆分數。

因為4 = 4

4 = 2 + 2

4 = 2 + 1 + 1

4 = 1 + 1 + 1 + 1

那麼對應著8的第二種情況的拆分數就是:

8 = 8

8 = 4 + 4

8 = 4 + 2 + 2

8 = 2 + 2 + 2 + 2,這幾種情況就是在4的拆分情況中將每個數乘以2. 但是它們的拆分數是一樣的。

還有一點,題目中說的n最大可以到1000000,但是在我的編譯器dev c++裡面,只要一執行int f[1000000],立馬奔潰,淚奔。

#include using namespace std;

#define mod 1000000000

int main()

while(cin>>n){

cout<

九度oj 題目1063 整數和

題目1063 整數和 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 4043 解決 2638 題目描述 編寫程式,讀入乙個整數n。若n為非負數,則計算n到2n之間的整數和 若n為乙個負數,則求2n到n之間的整數和 輸入 乙個整數n,n的絕對值小於等於1000 輸出 測試資料可能有多組,...

九度oj 1117 整數奇偶排序

時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 3113 解決 912 題目描述 輸入10個整數,彼此以空格分隔。重新排序以後輸出 也按空格分隔 要求 1.先輸出其中的奇數,並按從大到小排列 2.然後輸出其中的偶數,並按從小到大排列。輸入 任意排序的10個整數 0 100 彼此以空格分隔...

題目1190 大整數排序 九度OJ

題目1190 大整數排序 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 4694 解決 2108 題目描述 對n個長度最長可達到1000的數進行排序。輸入 輸入第一行為乙個整數n,1 n 100 接下來的n行每行有乙個數,數的長度範圍為1 len 1000。每個數都是乙個正數,並且保證...