傳送門
有\(n\)類物品,每種物品體積為\(v_i\),且都有無數多件。
問你塞滿容量為\(s\)的揹包方案數,對於每個\(s\in [1,m]\),\(m\)給定且\(\leq 10^5\),都求出方案數。答案對\(998244353\)取模。
\(30\%\)的資料,\(n,m\leq 3000\);
\(60\%\)的資料,純隨機生成;
\(100\%\)的資料,\(n,m\leq 10^5\),且一定滿足\(v_i \leq m\)
普通揹包隨便搞搞,複雜度\(\text(nm)\)。
顯然對於這類問題我們有乙個生成函式的解法:定義每種體積為\(k\)的物品的生成函式:
\[g_k(x)=1+x^k+x^+x^+\dotsb=\frac
\]那麼答案的生成函式就是:
\[f(x)=\prod_i g_(x)
\]容量為\(s\)的答案即為\([x^s]f(x)\)。
關鍵一次多項式乘法的複雜度很高。資料隨機還可以亂搞,但不隨機會被卡。
降低複雜度,除了換成點值表示,還可以乘法變加法:我們有\(e^a\cdot e^b=e^\)。
所以將所有\(g(x)\)求\(ln\)得到指數,然後相加可行呢?可是求指數也是個複雜度高的東西,但發現我們實際上\(g(x)\)求的\(ln\)只與\(k\)有關,而且是有規律的!
推導一下:
\[\begin
\ln\frac&=\int \frac)'}}\mathrm dx\\
&=\int (1+x^k+x^+\dotsb)'(1-x^k)\mathrm dx\\
&=\int (kx^+2kx^+\dotsb)(1-x^k)\mathrm dx\\
&=k\int (x^+x^+\dotsb)\mathrm dx\\
&=k(\fracx^k+\fracx^+\dotsb)\\
&=x^k+\fracx^+\fracx^\dotsb
\end
\]我們可以在調和級數複雜度求出來所有\(\ln g_k(x)\)!
邊求邊加,最後再多項式\(exp\)一下就完事了。總複雜度:\(\text(n\log n)\)
#include using namespace std;
const int maxn = 130000 + 5;
const int p = 1004535809, g = 3;
int inc(int a, int b)
int qpow(int a, int b)
int w[maxn << 3], inv[maxn << 2], fac[maxn << 2], ifac[maxn << 2];
void prework(int n)
inv[1] = fac[0] = ifac[0] = 1;
for (int i = 2; i < n; i++) inv[i] = 1ll*(p-p/i)*inv[p%i]%p;
for (int i = 1; i < n; i++) fac[i] = 1ll*fac[i-1]*i%p, ifac[i] = 1ll*ifac[i-1]*inv[i]%p;
}void ntt(int *a, int n, int opt)
struct poly
int &operator (int i)
void write()
void load(int *from, int n)
void cpyto(int *to, int n)
void resize(int n = 0) else a.resize(len = n, 0);
}} f, g;
poly poly_inv(poly a)
return b.resize(a.len), b;
}poly operator + (poly a, poly b)
poly operator - (poly a, poly b)
int getsize(int n)
poly operator * (poly a, poly b)
poly poly_deri(poly a)
poly poly_int(poly a)
poly poly_ln(poly a)
int n;
int main()
洛谷P4389 付公主的揹包
題目大意 有 n n leqslant10 5 種物品,第 i 個物品體積為 v i 都有 10 5 件。給定 m m leqslant10 5 對於 s in 1,m 請你回答用這些商品恰好裝 s 體積的方案數 題解 by weng weijie 揹包問題模板 誤 對每個物品構造生成函式 f x ...
洛谷 P4389 付公主的揹包 解題報告
付公主有乙個可愛的揹包qwq 這個揹包最多可以裝 10 5 大小的東西 付公主有 n 種商品,她要準備出攤了 每種商品體積為 v i 都有 10 5 件 給定 m 對於 s in 1,m 請你回答用這些商品恰好裝 s 體積的方案數 第一行 n,m 第二行 v 1 sim v n m 行,第 i 行代...
生成函式 洛谷P4389 付公主的揹包
考慮生成函式 每乙個物品的生成函式 begina x sum x frac end 後面為其封閉形式 答案 begin zeta x prod n sum x end 時間複雜度 theta nm log m 會 tle 把每乙個物品的生成函式都卷起來時間複雜度吃不消 但是加起來是可以的。考慮給 a...