付公主有乙個可愛的揹包qwq
這個揹包最多可以裝\(10^5\)大小的東西
付公主有\(n\)種商品,她要準備出攤了
每種商品體積為\(v_i\),都有\(10^5\)件
給定\(m\),對於\(s\in [1,m]\),請你回答用這些商品恰好裝\(s\)體積的方案數
第一行\(n,m\)
第二行\(v_1\sim v_n\)
\(m\)行,第\(i\)行代表\(s=i\)時方案數,對\(998244353\)取模
對於\(30\%\)的資料,\(n\le 3000,m\le 3000\)
對於\(60\%\)的資料,純隨機生成
對於\(100\%\)的資料, \(n\le 100000,m\le 100000\)
對於\(100\%\)的資料,\(v_i\le m\)
先構造一波生成函式
\[f_k(x)=\sum_^x^=\frac}
\]然後答案是\(n\)個東西卷起來,複雜度高達\(o(nm\log m)\),顯然苟不住
不妨把\(n\)個函式都取對數,然後就成了多項式加法,可以直接列舉倍數做到\(o(m\ln m)\),現在考慮如何轉換成為對數
\[\begin
g&=\ln f\\
g'&=\frac\\
&=(1-x^v)\sum_^\infty vix^\\
&=\sum_^\infty vix^-\sum_^\infty vix^\\
&=\sum_^\infty vix^-\sum_^\infty v(i-1)x^\\
&=\sum_^\infty vix^\\
g&=\int g'\\
&=\sum_^\infty \fracx^
\end
\]於是我們需要實現的就只有多項式exp啦
code:
#include #include const int n=(1<<18)+10;
const int mod=998244353,gi=332748118;
#define mul(a,b) (1ll*(a)*(b)%mod)
#define add(a,b) ((a+b)%mod)
int ans[n],g[n],turn[n],ina[n],inb[n],lna[n],lnb[n],exa[n],exb[n],cnt[n],inv[n];
int qp(int d,int k)return f;}
void ntt(int *a,int typ,int len)
{ int l=-1;for(int i=1;i>1]>>1|(i&1)<>1);
for(int i=0;i>1);
for(int i=0;i2018.12.29
洛谷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...