洛谷:
挺巧妙的題。
對於每件物品可以看成無窮多個,揹包轉移可以寫成卷積的形式,對於質量為\(v\)的物品,寫成生成函式就是:
\[f(x)=\sum_^x^
\]然後有\(1e5\)個這樣的東西,乘起來就是答案,複雜度\(o(mn\log n)\)。
但這樣顯然過不了,我們把上面的函式變一下:
\[f(x)=\sum_^x^=\frac
\]然後若干個乘起來就是:
\[ans=\prod_^\frac}
\]考慮用\(\ln\)化成為加:
\[\ln ans=\sum_^n\ln \frac}
\]由於:
\[\ln f(x)=\int f'(x)f^(x)~}x
\]帶進去可得:
\[\ln \frac}=\int \frac}~}x
\]展開再積分:
\[\ln \frac}=\int \sum_^vx^~}x=\sum_^\fracx^
\]那麼這個就可以直接算了,最後\(\exp\)一下就好了,注意處理出這個函式可以用記個桶然後調和級數的小技巧。
時間複雜度\(o(n\log n)\)。
#includeusing namespace std;
void read(int &x)
void print(int x)
void write(int x)
#define lf double
#define ll long long
const int maxn = 8e5+10;
const int inf = 1e9;
const lf eps = 1e-8;
const int mod = 998244353;
int add(int x,int y)
int del(int x,int y)
int mul(int x,int y)
int w[maxn],rw[maxn],pos[maxn],n,bit,f[maxn];
int tmp[10][maxn],n,m,cnt[maxn],inv[maxn],g[maxn],mxn;
int qpow(int a,int x)
void ntt_init()
void ntt_get(int len)
void ntt(int *r,int op)
int main()
洛谷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 付公主的揹包 解題報告
付公主有乙個可愛的揹包qwq 這個揹包最多可以裝 10 5 大小的東西 付公主有 n 種商品,她要準備出攤了 每種商品體積為 v i 都有 10 5 件 給定 m 對於 s in 1,m 請你回答用這些商品恰好裝 s 體積的方案數 第一行 n,m 第二行 v 1 sim v n m 行,第 i 行代...