洛谷P4389 付公主的揹包

2022-05-24 01:06:08 字數 2220 閱讀 8843

題目大意:有$n(n\leqslant10^5)$種物品,第$i$個物品體積為$v_i$,都有$10^5$件。給定$m(m\leqslant10^5)$,對於$s\in [1,m]$,請你回答用這些商品恰好裝$s$體積的方案數

題解:(by weng_weijie)

揹包問題模板(誤)

對每個物品構造生成函式$f(x)=\displaystyle\sum_^x^=\dfrac$

然後所有相乘就得到答案(不會乘)

對每個多項式求$\ln$加起來再求$\exp$,但是乙個個求也不行(複雜度$o(nm)$),可以記錄一下每個$v_i$的出現次數,一次性加起來,這樣處理出原式子的複雜度是$o(m\log_2m)$

於是:$$

\begin

\ln f(x)&=\int \frac dx \\\\

&=\int \sum_^vix^(1-x^v) dx \\\\

&=\int \sum_^vx^ dx\\\\

&=\sum_^\fracx^

\end

$$然後加起來求$\exp$

卡點:陣列開小

c++ code:

#include #include #define maxn 100010

#define n (262144 | 3)

const int mod = 998244353, g = 3;

int n, m;

int inv[n], a[n], b[n];

int num[maxn], maxvi;

namespace poly

inline int inv(int x)

int lim, ilim, s, rev[n];

int wn[n];

inline void init(int n)

inline void up(int &a, int b)

inline void ntt(int *a, int op = 1)

}} if (!op) for (int i = 0; i < lim; i++) a[i] = 1ll * a[i] * ilim % mod;

} inline void der(int *a, int *b, int n)

inline void int(int *a, int *b, int n)

int c[n];

void inv(int *a, int *b, int n)

inv(a, b, n + 1 >> 1), init(n << 1);

for (int i = 0; i < n; i++) c[i] = a[i];

for (int i = n; i < lim; i++) c[i] = b[i] = 0;

ntt(b), ntt(c);

for (int i = 0; i < lim; i++) b[i] = (2 + mod - 1ll * b[i] * c[i] % mod) * b[i] % mod;

ntt(b, 0);

for (int i = n; i < lim; i++) b[i] = 0;

} int d[n];

inline void ln(int *a, int *b, int n)

int e[n], f[n];

void exp(int *a, int *b, int n)

exp(a, b, n + 1 >> 1);

for (int i = 0; i < n << 1; i++) e[i] = f[i] = 0;

ln(b, e, n);

for (int i = 0; i < n; i++) f[i] = a[i];

ntt(b), ntt(e), ntt(f);

for (int i = 0; i < lim; i++) b[i] = (1ll + mod - e[i] + f[i]) * b[i] % mod;

ntt(b, 0);

for (int i = n; i < lim; i++) b[i] = 0; }}

int main()

} poly::exp(a, b, m);

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

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 付公主的揹包 解題報告

付公主有乙個可愛的揹包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...