付公主的背包

一、题目

点此看题

二、解法

直接做背包有点难,不妨试一试生成函数,设 \(G(x)\) 表示物品 \(i\) 的生成函数,那么:

\[G(x)=1+x^{v}+x^{2v}....=\frac{1}{1-x^{v}} \]

直接生成函数卷积没有帮助,所以我们对闭形式搞点事情,不难发现答案是所有闭形式相乘再展开。也就是 \(\prod\frac{1}{1-x^v}\),我们求出 \(\prod(1-x^v)\) 再使用多项式求逆即可,但是这时候暴力乘起不到任何优化效果。

下面的操作就难以置信了。化乘为加是常用技巧,可以用取对数实现,那么我们来看看对 \(1-x^V\) 取对数会产生什么东西:

\[\ln(1-x^v) \]

因为 \(\ln(x')=\frac{1}{x}\),所以可以尝试求导来去掉 \(\ln\),设 \(F(x)=1-x^v\)

\[\ln(F(x'))=\frac{F'(x)}{F(x)}=\frac{-vx^{v-1}}{1-x^v} \]

这个东西其实是母函数的闭形式,我们将其展开:

\[=-\sum_{i\geq0}vx^{v-1+v_i} \]

因为我们是求过导的,现在可以把它还原回去:

\[\ln(1-x^v)=-\sum_{i\geq0}\frac{vx^{v+v_i}}{v+vi}=-\sum_{i\geq1}\frac{vx^{vi}}{vi} \]

因为这里我们只需要算到 \(m\),所以把系数算出来的时间是调和级数求和(但是相同的物品需要一起算)

这里有点不懂,为什么只需要算到 m 呢?其实你可以看成是在模 x^{m+1} 意义下的运算,算出来的系数还是对的

然后多项式 \(\tt exp\) 之后多项式求逆,时间复杂度为 \(O(n\log n)\)

暂时没有代码,马上补!

posted @ 2021-03-03 22:13  C202044zxy  阅读(50)  评论(0编辑  收藏  举报