洛谷P4389 付公主的揹包 生成函式 多項式

2022-05-01 20:54:10 字數 2271 閱讀 5258

題目鏈結戳這裡

有\(n\)件不同的商品,每件物品都有無限個,輸出總體積為\([1,m]\)的方案數

直接跑揹包有\(30\)

考慮把每個物品的生成函式設出來,對於一件體積為\(v\)的物品:

\[f(x)=1+x^v+x^+\cdots +x^+\cdots

\]那麼答案\(f(x)\)就是每個物品的\(f\)卷起來:

\[f(x)=\prod\limits_^f_i(x)=\prod\limits_^\frac}

\]直接做是\(o(mnlog\ n)\)的

因為乘法比較麻煩,考慮將其轉化為加法,在兩邊分別取\(ln\)可得:

\[ln\ f(x)=\sum\limits_^ln\ f_i(x)

\]又觀察到對\(f(x)\)作如下變化後的形式很特殊,即:

\[ln\ f(x)=\int (ln\ f(x))'=\int \frac=\int (1-x^v)f'(x)=\int (1-x^v)\sum\limits_ivx^=\int \sum\limits_ivx^-\sum\limits_(i-1)vx^=\int \sum\limits_vx^=\sum\limits_i^x^

\]竟然是個調和級數的形式,太神奇了!於是\(o(nln\ n)\)地統計一下再做個\(exp\)就行了

#include #include #include using namespace std;

#define n 100000

#define mod 998244353

int n, m, v[n+5], cnt[n+5];

int f[4 * n + 5], g[4 * n + 5], f1[4 * n + 5], g1[4 * n + 5], h[4 * n + 5];

int fpow(int x, int p)

return ret;

}void bitreverse(int *s, int len, int bit)

}void dft(int *s, int flag, int len, int bit)

}} if (flag) }

void polyinv(int *f, int *g, int c)

int len = 1 << c;

polyinv(f, g, c - 1);

for (int i = 0; i < len; ++i)

f1[i] = f[i];

dft(f1, 0, len << 1, c + 1), dft(g, 0, len << 1, c + 1);

for (int i = 0; i < (len << 1); ++i)

g[i] = g[i] * (2 - 1ll * f1[i] * g[i] % mod) % mod;

dft(g, 1, len << 1, c + 1);

for (int i = len; i < (len << 1); ++i)

g[i] = 0;

}void d(int *f, int *g, int c)

void d_(int *f, int *g, int c)

void polyln(int *f, int *g, int c)

void polyexp(int *f, int *g, int c)

int len = 1 << c;

polyexp(f, g, c - 1);

polyln(g, h, c);

h[0] = (1 - h[0] + f[0]) % mod;

for (int i = 1; i < len; ++i)

h[i] = (f[i] - h[i]) % mod;

dft(g, 0, len << 1, c + 1), dft(h, 0, len << 1, c + 1);

for (int i = 0; i < (len << 1); ++i)

g[i] = 1ll * g[i] * h[i] % mod, h[i] = 0;

dft(g, 1, len << 1, c + 1);

for (int i = len; i < (len << 1); ++i)

g[i] = 0;

}int main()

for(int i = 1; i <= m; ++i)

polyexp(f, g, bit);

for(int i = 1; i <= m; ++i) printf("%d\n", (g[i]+mod)%mod);

return 0;

}

洛谷P4389 付公主的揹包

傳送門 有 n 類物品,每種物品體積為 v i 且都有無數多件。問你塞滿容量為 s 的揹包方案數,對於每個 s in 1,m m 給定且 leq 10 5 都求出方案數。答案對 998244353 取模。30 的資料,n,m leq 3000 60 的資料,純隨機生成 100 的資料,n,m leq...

洛谷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 付公主的揹包

考慮生成函式 每乙個物品的生成函式 begina x sum x frac end 後面為其封閉形式 答案 begin zeta x prod n sum x end 時間複雜度 theta nm log m 會 tle 把每乙個物品的生成函式都卷起來時間複雜度吃不消 但是加起來是可以的。考慮給 a...