P4389 付公主的背包 做题记录

这个背包最多可以装 10510^5 大小的东西

付公主有 nn 种商品,她要准备出摊了

每种商品体积为 viv_i,都有无限件

给定 mm,对于 s[1,m]s\in [1,m],请你回答用这些商品恰好装 ss 体积的方案数。

朴素的做法是 nn 个长度为 mm 的多项式相乘,时间复杂度为 O(nmlogm)O(nm\log m),显然会 TLE

考虑一个物品的生成函数:

f(x)=i=0inf[i0(modv)]xif(x)=\sum\limits_{i=0}^{\inf}[i\equiv 0\pmod v]x^i

=i=0infxiv=\sum\limits_{i=0}^{\inf}x^{iv}

显然这个式子当且仅当 1<x<1-1<x<1 时收敛,所以我们考虑令 0<x<10<x<1

i=0infxiv=limninfxnv1xv1\sum\limits_{i=0}^{\inf}x^{iv}=\lim\limits_{n\to\inf}\dfrac{x^{nv}-1}{x^v-1}

由于当 nn 无限大时 xnvx^{nv} 无限趋近于 00,所以:

limninfxnv1xv1=1xv1=11xv\lim\limits_{n\to\inf}\dfrac{x^{nv}-1}{x^v-1}=\dfrac{-1}{x^v-1}=\dfrac{1}{1-x^v}

也就是说 f(x)=11xvf(x)=\dfrac{1}{1-x^v}

我们要求很多个 ff 的乘积,那么考虑化乘为加,给 f(x)f(x) 取个 ln\ln,求:

lnf(x)=ln(11xv)\ln f(x)=\ln(\dfrac{1}{1-x^v})

=ln(1xv)=-\ln(1-x^v)

这个东西不太好求,考虑求导:

ln(1xv)=(1xv)1xv-\ln'(1-x^v)=-\dfrac{(1-x^v)'}{1-x^v}

=1(xv)1xv=-\dfrac{1'-(x^v)'}{1-x^v}

=vxv11xv=-\dfrac{-vx^{v-1}}{1-x^v}

=vxv111xv=vx^{v-1}\dfrac{1}{1-x^v}

注意到 11xv=i=0infxiv\dfrac{1}{1-x^v}=\sum\limits_{i=0}^{\inf}x^{iv},所以:

=vxv1i=0infxiv=vx^{v-1}\sum\limits_{i=0}^{\inf}x^{iv}

=i=0infvx(i+1)v1=\sum\limits_{i=0}^{\inf}vx^{(i+1)v-1}

=i=1infvxiv1=\sum\limits_{i=1}^{\inf}vx^{iv-1}

积分回来:

lnf(x)=i=1infvxiv1dx\ln f(x)=\sum\limits_{i=1}^{\inf}\int vx^{iv-1}dx

=i=1inf1iivxiv1dx=\sum\limits_{i=1}^{\inf}\int \dfrac{1}{i}ivx^{iv-1} dx

=i=1inf1ixiv=\sum\limits_{i=1}^{\inf}\dfrac{1}{i}x^{iv}

好了,我们终于求得了 f(x)=i=1inf1ixivf(x)=\sum\limits_{i=1}^{\inf}\dfrac{1}{i}x^{iv}

接下来把它们相加,求 exp\exp 即可。

具体的做法是,开一个桶 tit_iv=iv=i 的多项式有多少个,然后调和级数搞即可。