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

2022-05-31 08:42:13 字數 1280 閱讀 4108

考慮生成函式

每乙個物品的生成函式:

\(\begina(x)=\sum_x^=\frac\end\)

(後面為其封閉形式)

答案:\(\begin\zeta(x)=\prod_^n\sum_x^\end\)

時間複雜度 \(\theta(nm\log m)\),會 \(tle\)。

把每乙個物品的生成函式都卷起來時間複雜度吃不消——但是加起來是可以的。

考慮給\(a(x)\)取個\(\ln\),然後再\(exp\)回去。

設:\(f(x)=1-x^v,g(x)=\ln f(x)\)

開始推式子:

\(\begin

g(x)&=\ln f(x)\\

g'(x)&=\frac\\

g'(x)&=-\frac}\\

g'(x)&=-\sum_v\times x^\times x^\\

g'(x)&=-\sum_v\times x^\\

g(x)&=-\sum_\frac}\\

g(x)&=-\sum_\frac}\\

\ln a(x)&=\sum_\frac}

\end\)

有了這個式子,我們就可以很容易地將各物品的\(\ln\)的和求出來了,然後再將求出來的式子進行\(exp\)還原即可。

#includeusing namespace std;

const int n=4e5+5,mod=998244353;

int a[n],b[n],rev[n],inv[n],cnt[n],n,m,l,x;

int pow(int a,int b)

return res;

}void get(int n,int opt=1)

void fft(int *a,int opt)

} if (opt==-1) for (int i=0,v=pow(l,mod-2);i}void qiud(int *f,int *g,int n)

void jif(int *f,int *g,int n)

void inv(int *f,int *g,int n)

}void ln(int *f,int *g,int n)

void exp(int *f,int *g,int n)

}int main()

exp(b,a,m+1);

for (int i=1;i<=m;i++) b[i]=(b[i]+mod)%mod,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 付公主的揹包

題目大意 有 n n leqslant10 5 種物品,第 i 個物品體積為 v i 都有 10 5 件。給定 m m leqslant10 5 對於 s in 1,m 請你回答用這些商品恰好裝 s 體積的方案數 題解 by weng weijie 揹包問題模板 誤 對每個物品構造生成函式 f x ...

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

題目鏈結戳這裡 有 n 件不同的商品,每件物品都有無限個,輸出總體積為 1,m 的方案數 直接跑揹包有 30 考慮把每個物品的生成函式設出來,對於一件體積為 v 的物品 f x 1 x v x cdots x cdots 那麼答案 f x 就是每個物品的 f 卷起來 f x prod limits ...