分拆数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 转移操作本质上都是进行多项式操作,可以"叠加", 所以我们可以先完成暴力逐个加入的部分然后在上面跑这个做法, 正确性是有保证的.

posted @ 2025-07-25 18:23  QedDust  阅读(11)  评论(0)    收藏  举报