洛谷 P4389 付公主的揹包 解題報告

2022-04-29 23:42:12 字數 1395 閱讀 1970

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