付公主的背包
一、题目
二、解法
直接做背包有点难,不妨试一试生成函数,设 \(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)\)
暂时没有代码,马上补!