洛谷P4389 付公主的揹包

2022-03-25 18:09:14 字數 2206 閱讀 7695

傳送門

有\(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...