一、题目
二、解法
直接做背包有点难,不妨试一试生成函数,设 (G(x)) 表示物品 (i) 的生成函数,那么:
[G(x)=1+x^{v}+x^{2v}....=frac{1}{1-x^{v}}
]
直接生成函数卷积没有帮助,所以我们对闭形式搞点事情,不难发现答案是所有闭形式相乘再展开。也就是 (prodfrac{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_{igeq0}vx^{v-1+v_i}
]
因为我们是求过导的,现在可以把它还原回去:
[ln(1-x^v)=-sum_{igeq0}frac{vx^{v+v_i}}{v+vi}=-sum_{igeq1}frac{vx^{vi}}{vi}
]
因为这里我们只需要算到 (m),所以把系数算出来的时间是调和级数求和(但是相同的物品需要一起算)
这里有点不懂,为什么只需要算到 m 呢?其实你可以看成是在模 x^{m+1} 意义下的运算,算出来的系数还是对的
然后多项式 ( t exp) 之后多项式求逆,时间复杂度为 (O(nlog n))
暂时没有代码,马上补!