190512 整數拆分

2021-09-22 10:20:04 字數 1916 閱讀 6190

題目描述

乙個整數總可以拆分為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...