51Nod 1259 整數劃分 V2

2021-08-29 16:30:09 字數 954 閱讀 7244

將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 = 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

#define rg register

using namespace std;

inline int gi()

const int n = 50010, mod = 1e9+7;

int f[n], g[250][n], s[n];

int main()

} for (int i = 0; i <= n; i++)

ans = (ans + (ll)f[i]*s[n-i]%mod) % mod;

printf("%lld\n", ans);

return 0;

}

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

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

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

題目 將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 我們可以先考慮...

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。因此第一種方案更優。並且第一種...