给定$n$种物品,每种物品的体积为$w_i$,有无限个。对于$c\in[1,m]$,求出用这些物品正好装满体积为$c$的背包的总数。
$\texttt{Data Range:}n,m\leq 10^5,w_i\leq m$
链接
题解
考虑写出每种物品的生成函数。
如果没有体积的限制,那生成函数是
但是有了体积的限制,咋办?
考虑将一个体积为$v$的物品拆成$v$个体积为$1$的物品,再把这些体积为$1$的物品每$v$个捆绑成一组。所以说,你每次只能拿$v$的倍数个体积为$1$的物品,那么生成函数就是
也即
写成封闭形式,有
于是答案就是每种物品对应的生成函数的卷积。可是时间复杂度过高,考虑优化。
假设第$i$种物品所对应的生成函数为$F_i(x)$,答案所对应的生成函数为$G(x)$,则
于是很自然的想到两边取对数,有
暴力的求$\ln F_i(x)$是$O(n^2\log n)$的,所以考虑巧妙的求,所以开始推柿子。
设$H(x)=\ln F(x)$,则
展开得
暴力乘上去
所以说
对每种物品求出该多项式相加后$\texttt{exp}$即可。
代码
1 |
|