題目大意:有$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...