简单的一点背包计数
谈谈背包计数问题.
其实都很trivial啊,就算是自己梳理一下吧,欢迎指出错误.
背包计数可以和GF建立直观联系.(也可以看成不定方程计数)
考虑每个物品的GF,合并多个物品是卷.
01背包中重量为 \(w\) 的物品即 \(1+x^w\).
完全背包中重量为 \(w\) 的物品即 \(\sum \limits_{i=0}^{\infty} x^{iw}\).
也就是 \(\dfrac{1}{1-x^w}\).
多重背包中重量为 \(w\) 的物品有 \(v\) 个即 \(\sum \limits_{i=0}^{v} x^{iw}\).
也就是 \(\dfrac{1-x^{w(v+1)}}{1-x^w}\).
1.可撤销背包
对于01背包或者是完全背包,撤销其中元素即乘上对应逆元,直观理解就是把dp过程反过来.
常见操作与生成函数的对应.
for(int i=w;i<=n;++i){f[i]+=f[i-w];}//除以 (1-x^w)
for(int i=w;i<=n;++i){f[i]-=f[i-w];}//除以 (1+x^w)
for(int i=n;i>=w;--i){f[i]+=f[i-w];}//乘以 (1+x^w)
for(int i=n;i>=w;--i){f[i]-=f[i-w];}//乘以 (1-x^w)
//模 $x^{n+1}$ 意义下
多重背包同样,不过好像没人出,可能不够直观.
2.分拆数
分拆数就等效于任意体积的物品的完全背包,即 \(\prod \limits_{i=1}^{\infty} \dfrac{1}{1-x^{i}}\).
欧拉变换
用欧拉变换表示即 \(\mathcal{E}(\dfrac{x}{1-x})\).
用ln-exp可做到 \(O(n\log n)\).
五边形数递推
\(\prod \limits_{i=1}^{\infty} {(1-x^{i})}\) 是欧拉函数(与数论那个不一样).
这就是分拆数生成函数的逆,分拆数基于五边形数的递推等价于朴素多项式求逆.
由于欧拉函数前 \(n\) 项只有 \(O(\sqrt{n})\) 项非零,因此其复杂度为 \(O(n\sqrt{n})\) .
至于为何只有五边形数位置非零可参考 https://en.wikipedia.org/wiki/Pentagonal_number_theorem
传统根号分治
不妨设 \(dp_{i,j}\) 表示有 \(i\) 个体积大于等于 \(m\) 的物品, 总容量为 \(j\) 的方案数.
转移就是 \(dp_{i,j}=dp_{i,j-i}+dp_{i-1,j-m}\) (新加入一个体积为 \(m\) 的物品,或全体+1).
设 \(dp_i\) 的生成函数为 \(F_i\) 则有.
\(F_0=1\)
\(F_i=\dfrac{x^mf_{i-1}}{1-x^i}=\dfrac{x^{im}}{\prod \limits_{j=1}^{i}{(1-x^j)}}\)
根据组合意义,对 \(F_i\) 求和得体积大于等于 \(m\) 的完全背包方案,可线性求出卷积的一项以计算n的拆分数.
(当然你也可以把初始值设成体积小于m的完全背包方案数然后叠加从而全部求出)
代数推导
试证明:\(\sum\limits_{i} F_i=\prod \limits_{i=m}^{\infty}\dfrac{1}{1-x^i}\)
引入 \(y\) 表示物品个数,令 \(G_{i,m}=F_{i}y^{i}=\dfrac{x^{im}y^i}{\prod \limits_{j=1}^{i} {(1-x^j)}}\)
则 \((1-x^i)G_{i,m}=x^myG_{i-1,m}\) 即 \(G_{i,m}=x^iG_{i,m}+x^myG_{i-1,m}\)
带物品个数的物品体积大于等于 \(m\) 背包的二元生成函数即为
\(H_m=\prod \limits_{i=m}^{\infty}\dfrac{1}{1-x^iy}\)
对\(G_{i,m}\)求和得 \(S_m=\sum \limits_iG_{i,m}=\sum \limits_ix^iG_{i,m}+x^myS_m\)
\(S_m=\dfrac{1}{1-x^my}\sum \limits_ix^iG_{i,m}=\dfrac{1}{1-x^my}\sum \limits_iG_{i,m+1}=\dfrac{1}{1-x^my}S_{m+1}\)
\(S_m=\prod \limits_{i=m}^{\infty}\dfrac{1}{1-x^iy}\)
这说明 \(H_m=S_m=\sum \limits_iG_{i,m}\)
对 \(y^i\) 求和即得 \(\sum\limits_{i} F_i=\prod \limits_{i=m}^{\infty}\dfrac{1}{1-x^i}\)
EI 的做法
\(\prod \limits_i \dfrac{1}{1-x^{i}} = \sum \limits_{h} (x^{h^2} \prod \limits_{k=1}^{h} \frac{1}{(1-x^k)^2})\)
这个式子就是枚举ferry图内最大的正方形.
代数推导
我不会,嘤嘤嘤.3.多维限制的背包计数
可以看成多元生成函数,不过感觉二维都没咋见过.
比如01背包中重量为 \(w\) 体积为 \(V\) 的物品可以看作 \(1+x^wy^V\) 等等.
4.一些题目,想到再补.
abc321f #(subset sum = K) with Add and Erase
[HAOI2008] 硬币购物
loj6077 逆序对
loj6089 小 Y 的背包计数问题
loj6268 分拆数
luogu13349 「ZYZ 2025」自然数序列