洛谷4389 付公主的揹包

2022-05-30 19:00:11 字數 1238 閱讀 6718

洛谷:

挺巧妙的題。

對於每件物品可以看成無窮多個,揹包轉移可以寫成卷積的形式,對於質量為\(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 行代...