題目描述
乙個整數總可以拆分為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。
示例1
輸入7
輸出思路:我沒有思路。大佬的思路是找規律。
搬運一下思路:
記f(n)為n的劃分數,我們有遞推公式:
f(2m + 1) = f(2m),
f(2m) = f(2m - 1) + f(m),
初始條件:f(1) = 1。
證明:證明的要點是考慮劃分中是否有1。
記:a(n) = n的所有劃分組成的集合,
b(n) = n的所有含有1的劃分組成的集合,
c(n) = n的所有不含1的劃分組成的集合,
則有: a(n) = b(n)∪c(n)。
又記:f(n) = a(n)中元素的個數,
g(n) = b(n)中元素的個數,
h(n) = c(n)中元素的個數,
易知: f(n) = g(n) + h(n)。
以上記號的具體例子見文末。
我們先來證明: f(2m + 1) = f(2m),
首先,2m + 1 的每個劃分中至少有乙個1,去掉這個1,就得到 2m 的乙個劃分,故 f(2m + 1)≤f(2m)。
其次,2m 的每個劃分加上個1,就構成了 2m + 1 的乙個劃分,故 f(2m)≤f(2m + 1)。
綜上,f(2m + 1) = f(2m)。
接著我們要證明: f(2m) = f(2m - 1) + f(m),
把 b(2m) 中的劃分中的1去掉乙個,就得到 a(2m - 1) 中的乙個劃分,故 g(2m)≤f(2m - 1)。
把 a(2m - 1) 中的劃分加上乙個1,就得到 b(2m) 中的乙個劃分,故 f(2m - 1)≤g(2m)。
綜上,g(2m) = f(2m - 1)。
把 c(2m) 中的劃分的元素都除以2,就得到 a(m) 中的乙個劃分,故 h(2m)≤f(m)。
把 a(m) 中的劃分的元素都乘2,就得到 c(2m) 中的乙個劃分,故 f(m)≤h(2m)。
綜上,h(2m) = f(m)。
所以: f(2m) = g(2m) + h(2m) = f(2m - 1) + f(m)。
這就證明了我們的遞推公式。
**:
#include #define maxsize 1000001
using namespace std;
int main()
{ //f(2m + 1) = f(2m),
//2m) = f(2m - 1) + f(m),
int n;
int result[maxsize];
result[0]=result[1]=1;
for(int i=2;i>n)//scanf("%d",&n)!=eof
cout<知識點:
reference:
[1] 異或位左移右移運算子詳解
整數拆分問題
問題 對於1個正整數n,將其拆分成幾個正整數的和,如何拆分可使得其乘積最大?csdn使用者pathuang68給出的結論是 如果不在乎是否為整數的話,那麼把每份平均分為e 2.71828459045.時,所得到的乘積是最大的,如果要是整數的話,那麼就選盡可能地靠近e的整數即可,比如3。具體證明請參見...
pta 整數拆分
給定乙個整數n,將其無序拆分成最大數為k的拆分數,n,k不超出100 要求 所有的拆分方案不重複。如當n 4,k 4時,一共有5種拆分方案,拆分如下 1 4 1 1 1 1 2 4 1 1 2 3 4 1 3 4 4 2 2 5 4 4輸入格式 每一行輸入一組整數n,k,遇到鍵盤結束符 z或檔案結束...
整數拆分 python
我們都知道有一門數學領域叫組合數學,其中整數的拆分問題是非常有名的,例如 我們有1g 2g 3g 4g 5g的砝碼各乙個,問能稱出多少的重量,各有多少稱法 這裡我們利用尤拉提出的母函式的概念 當然拉馬努金的公式也可以,拉馬努金是我非常喜歡的數學家 直接帶入求解,1 x 1 x 2 1 x 3 1 x...