題目描述:乙個整數總可以拆分為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。每個數都是乙個正數,並且保證...