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