分拆数plus
如果你要求的是由体积 \([m,r]\) 的物品组成的完全背包方案数而且要对 \(1\sim n\) 求怎么办呢, 我们给出如下的方式
\(dp_{i,j}\) 有 \(i\) 个物品 体积为 \(j\) 的方案数
转移如下加入一个体积为 \(m\) 的物品
全体体积 \(+1\) (还要扣掉已经含有 \(r\) 的)
\(dp_{i,j}=dp_{i-1,j-m}+dp_{i,j-i}-dp_{i-1,j-i-r}\)
边界即 \(dp_{0,0}=1\)
计 \(F_i=\sum \limits_{i=0}^{\infty}dp_ix^i\)
其边界显然是 \(F_0=1\)
易得转移为 \(F_i=\dfrac{(x^m-x^{r+i})F_{i-1}}{1-x^i}\)
即证 \(\sum \limits_i F_i=\prod \limits_{i=m}^{r} \dfrac{1}{1-x^i}\)
证明:
同样引入 \(y^i\) 表示物品个数
\(G_{m,i}=y^i F_i =\dfrac{(x^m-x^{r+i})yG_{m,i-1}}{1-x^i}\)
\(G_{m,i}=(x^m-x^{r+i})yG_{m,i-1}+x^iG_{m,i}\)
\(G_{m,i}=\dfrac{\prod \limits_{j=1}^i{(x^m-x^{r+j})}}{\prod \limits_{j=1}^i{(1-x^j)}}y^i\)
\(G_{m+1,i}=\dfrac{\prod \limits_{j=1}^i{(x^{m+1}-x^{r+j})}}{\prod \limits_{j=1}^i{(1-x^j)}}y^i\)
\(=\dfrac{x^i(x^m-x^{r})\prod \limits_{j=1}^{i-1}{(x^{m}-x^{r+j})}}{\prod \limits_{j=1}^i{(1-x^j)}}y^i\)
\(=\dfrac{[x^i(x^m-x^{r+i})-x^{r+i}(1-x^{i})]\prod \limits_{j=1}^{i-1}{(x^{m}-x^{r+j})}}{\prod \limits_{j=1}^i{(1-x^j)}}y^i\)
\(G_{m+1,i}=x^iG_{m,i}-x^{r+i}yG_{m,i-1}\)
下面引入 \(S\) 对 \(i\) 求和.
\(S_{m}=\sum \limits_{i}G_{m,i}=\sum \limits_{i}(x^m-x^{r+i})yG_{m,i-1}+\sum \limits_{i}x^iG_{m,i}\)
\(S_{m}=\sum \limits_{i}G_{m,i}=\sum \limits_{i}(x^{m}y-x^{r+i}y+x^i)G_{m,i}\)
\(S_{m}=(x^my)S_{m}+\sum \limits_{i}(x^i-x^{r+i}y)G_{m,i}\)
\(S_{m}=(x^my)S_{m}+\sum \limits_{i}G_{m+1,i}\)
\(S_{m}=(x^my)S_{m}+S_{m+1}\)
容易发现 \(S_{r+i}\) 其中 \(i\in N^+\) 均为 \(1\)
\(S_m=\dfrac{1}{1-x^my}S_{m+1}=\prod\limits_{i=m}^r(\dfrac{1}{1-x^iy})\)
显然这就是所求的二元生成函数, 对 \(y\) 求和易得原式
主包主包, 你写的很对可是复杂度是 \(O(\frac{n^2}{m})\) 怎么办?
我们不妨设分治阈值 \(x={\sqrt n}\)
首先我们发现, 如果 \(m,r\) 均小于阈值, 直接暴力逐个加入物品即可.
如果均大于阈值直接按刚才的方式做复杂度同样不超过 \(O(n\sqrt n)\)
如果在左右两侧容易分别处理\([m,x]\) \([x+1,r]\)并线性合并处理一项.
主包主包,那每一项怎么办?
我们可以考虑如下的思路, 我们的 dp 转移操作本质上都是进行多项式操作,可以"叠加", 所以我们可以先完成暴力逐个加入的部分然后在上面跑这个做法, 正确性是有保证的.