51nod 1259 整數劃分 V2(分塊dp)

2021-10-24 20:15:49 字數 1049 閱讀 6576

題目

將n分為若干個整數的和,有多少種不同的劃分方式,例如:n = 4, ,共5種。由於資料較大,輸出mod 10^9 + 7的結果即可。

輸入輸入1個數n(1 <= n <= 50000)。

輸出輸出劃分的數量mod 10^9 + 7。

輸入樣例

輸出樣例

題解分塊dp

複雜度o(n*sqrt(n))

設m = sqrt(n)

我們可以先考慮使用1~m湊成數的方案, 完全揹包即可

對於剩下的m+1 ~ n 我們發現每個數最多使用 m 次

然後g[i][j] 表示使用了i個數(m+1~m+i)和為j的方案數

令m++

g[i][j] = g[i-1][j-m] + g[i][j-i]

這什麼意思呢?

對於乙個序列,我們有兩種操作:

1.新增乙個基數m

2.給每個數+1(注意這裡的j是正著列舉的,所以可重複給每個數加一)

**

#include

#define ll long long

using namespace std;

const

int n =

50010

, mod =

1e9+7;

// f[i]: 僅使用m以內的數可以組成i的數量

// g[i][[j]: i個數(m+1~m+i)和為j的方案數

int f[n]

, g[

250]

[n], s[n]

;int

main()

}int ans =0;

g[0]

[0]=

1;s[0]

=1;for

(int i =

1; i < m; i++)}

for(

int i =

0; i <= n; i++

)printf

("%lld\n"

, ans)

;return0;

}

51Nod 1259 整數劃分 V2

將n分為若干個整數的和,有多少種不同的劃分方式,例如 n 4,共5種。由於資料較大,輸出mod 10 9 7的結果即可。input 輸入1個數n 1 n 50000 output 輸出劃分的數量mod 10 9 7。input示例 output示例 分塊dp 複雜度o n sqrt n 設m sqr...

51nod 1259 「整數劃分 V2「 動規

1259 整數劃分 v2 題面比較直白,不解釋 這個整數劃分和dp的入門題的整數劃分有不同,就是資料範圍,這個資料範圍是5w,o n 2 肯定不行.這裡的方法是我們想象 把n的劃分分為兩個部分 成分為 1,根號n 另一部分是 根號n 1,n 比如n 4 4的開方為2 那麼我們對於,這個劃分,就是由,...

51nod 1128 正整數分組 V2

給出乙個長度為n的正整數陣列,不改變陣列元素的順序,將這n個數分為k組。各組中元素的和分別為s1,s2 sk。如何分組,使得s1至sk中的最大值最小?例如 1 2 3 4 5 6分為3組,元素和為6,9,6,最大值為9。也可以分為 元素和為 10 5 6,最大值為10。因此第一種方案更優。並且第一種...