这个背包最多可以装 105 大小的东西
付公主有 n 种商品,她要准备出摊了
每种商品体积为 vi,都有无限件
给定 m,对于 s∈[1,m],请你回答用这些商品恰好装 s 体积的方案数。
朴素的做法是 n 个长度为 m 的多项式相乘,时间复杂度为 O(nmlogm),显然会 TLE
考虑一个物品的生成函数:
f(x)=i=0∑inf[i≡0(modv)]xi
=i=0∑infxiv
显然这个式子当且仅当 −1<x<1 时收敛,所以我们考虑令 0<x<1:
i=0∑infxiv=n→inflimxv−1xnv−1
由于当 n 无限大时 xnv 无限趋近于 0,所以:
n→inflimxv−1xnv−1=xv−1−1=1−xv1
也就是说 f(x)=1−xv1
我们要求很多个 f 的乘积,那么考虑化乘为加,给 f(x) 取个 ln,求:
lnf(x)=ln(1−xv1)
=−ln(1−xv)
这个东西不太好求,考虑求导:
−ln′(1−xv)=−1−xv(1−xv)′
=−1−xv1′−(xv)′
=−1−xv−vxv−1
=vxv−11−xv1
注意到 1−xv1=i=0∑infxiv,所以:
=vxv−1i=0∑infxiv
=i=0∑infvx(i+1)v−1
=i=1∑infvxiv−1
积分回来:
lnf(x)=i=1∑inf∫vxiv−1dx
=i=1∑inf∫i1ivxiv−1dx
=i=1∑infi1xiv
好了,我们终于求得了 f(x)=i=1∑infi1xiv。
接下来把它们相加,求 exp 即可。
具体的做法是,开一个桶 ti 存 v=i 的多项式有多少个,然后调和级数搞即可。