洛谷 P4389 付公主的揹包 多項式exp

2021-09-12 19:07:38 字數 2418 閱讀 6710

題目鏈結

這題乍一眼應該是個生成函式題

我們可以把體積轉化成生成函式f(x

)=[x

f(x)=[x

f(x)=[

x%v==0

]v==0]

v==0

]然後跑1e5次fft就可以了

emmm,感覺有點不妙啊,1e5次fft什麼的好像肯定要t啊

我們感受下複雜度主要集中在卷積上面

因為求ln能化乘為加,所以可以對生成函式求一波ln康康

好的,發現很有規律f(x

)=[x

f(x)=[x

f(x)=[

x%v==0

]∗1x

v==0]*\frac

v==0]∗

x1​那麼調和級數加一下,求exp就可以啦,至於相同項,肯定是出現幾次加幾倍嘍

**如下:

#include

#define mod 998244353

#define gg 3

using

namespace std;

int r[

400040

],n,v,cnt[

200020];

long

long inv[

400040

],tmp1[

400040

],tmp2[

400040

],t***[

400040

],ln[

400040

],f[

400040

],de[

400040

],in[

400040

],ex[

400040];

long

long

kasumi

(long

long a,

long

long b)

return ans;

}void

ntt(

long

long

*a,int kd,

int cnt)

for(

int mid=

1;mid}}

if(kd)}}

void

rev(

int cnt)

}void

der(

const

long

long

*a,int cnt)

}void

inte

(const

long

long

*a,int cnt)

}void

get_inv

(const

long

long

*a,int len)

ntt(tmp1,

0,cnt)

;ntt

(tmp2,

0,cnt)

;for

(int i=

0;i)ntt

(tmp1,

1,cnt)

;for

(int i=

0;i>

1;i++)}

}void

get_ln

(const

long

long

*a,int len)

void

get_exp

(const

long

long

*a,int len)

for(

int i=lim>>

1;i) tmp1[i]

=tmp2[i]

=t***[i]=0

;ntt

(t***,

0,cnt)

;ntt

(tmp1,

0,cnt)

;ntt

(tmp2,

0,cnt)

;for

(int i=

0;i)ntt

(t***,

1,cnt)

;for

(int i=

0;i>

1;i++)}

}int

main()

for(

int i=

1;i<=v;i++)}

}// for(int i=1;i<=10;i++) printf("%lld ",f[i]);

// puts("");

get_exp

(f,(v+1)

*2);

for(

int i=

1;i<=v;i++

)printf

("%lld\n"

,ex[i]);

}

洛谷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 行代...