“布尔格 $2^N$ 上的Möbius 反演使用系数 $( 1)^{ S\setminus T }$。对每个秩 $k$ 做反演: $$ h k(S)=\sum {T\subseteq S} (…”
形式陈述 ​
从恒等式到算法 ​
把容斥原理转成算法时,若全集对象集合为
算法价值取决于给定
子集变换 ​
对函数
可用逐元素 DP:对每位
直觉
容斥用交替符号修正“至少违反一个约束”中的重复计数;子集变换则把许多彼此重叠的子集和沿布尔格边逐维复用。两者的效率都取决于坏性质数量
例子与边界
满射计数例子 ​
从
交集计数闭式便宜,容斥把“每盒非空”的全局约束转成
数值与边界 ​
符号交替会产生巨大中间整数和严重浮点消去,精确计数应使用大整数或模运算;模数下减法需正规化。空集项符号和
推论与应用
当每个子集的交集贡献可按子集状态复用时,容斥可与动态规划结合,通过子集递推、zeta/Möbius 变换或按最后元素转移避免重复计算所有交。
原地 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.