从恒等式到算法 ​
把容斥原理转成算法时,若全集对象集合为
算法价值取决于给定
子集变换 ​
对函数
可用逐元素 DP:对每位
满射计数例子 ​
从
交集计数闭式便宜,容斥把“每盒非空”的全局约束转成
数值与边界 ​
符号交替会产生巨大中间整数和严重浮点消去,精确计数应使用大整数或模运算;模数下减法需正规化。空集项符号和
原地 transform 不变量 ​
Zeta transform 的第
Subset convolution 不是普通 zeta 后逐点相乘即可;通常还要按子集大小分层做 ranked transform,避免把重叠子集对计入。相邻 transform 的名字相近,运算域和目标卷积必须写清。
变换方向的最小核对例 ​
对两元素集合,zeta transform 把 F[S]+=F[S\setminus\{i\}],每条包含关系恰贡献一次;Möbius 逆变换把加号改为减号并按同样偏序恢复原数组。
原地实现时,外层必须固定一个元素 bit,内层只从不含该 bit 的旧侧流向含该 bit 的新侧。若对同一 bit 反向又更新源状态,会在一轮内重复计数。数值在交替求和中可能远超最终答案,模运算、整数位宽和浮点消去误差都要按应用另行处理。
参考资料
- Richard Karp, Dynamic Programming Meets the Principle of Inclusion and Exclusion, Operations Research Letters, 1982.
- Andreas Björklund et al., Fourier Meets Möbius: Fast Subset Convolution, STOC, 2007.