【学习笔记】容斥
Loading...
理解本质:
一般化:
\(n\) 个条件(属性、限制) \(A_1 \cdots A_n\),物品集合 \(S\)。
计数答案的形式:
其中 \(c(x, A_i)\) 表示物品 \(x\) 在 \(A_i\) 条件下的贡献,\(f(A_i)\) 则表示 \(A_i\) 条件的容斥系数。
e.g. 对于维恩图上求并集,我们要让一个拥有 \(k\) 个属性的集合只被算一次,考虑这个物品被那些属性集合枚举到,可以得到
\[\sum_{i=1}^{k} C^i_k f(i) = 1 \]一个合理的构造:\(f(i) = (-1)^{i+1}\)。
题目中有时候出现很难求 \(B_0\),但是求 \(B_{1\sim n}\) 相对简单,我们用容斥将每个物品贡献到相应的地方
这里的 \(s(B_i)\) 类似上文中的 \(\sum_{x \in S} c(x, A_i)\)。
这个容斥系数怎么求,也就是计数问题的重点。不同的问题有不同的解法,不过还是有迹可循的。
一定要抓住计数对象是谁、条件是谁,搞清楚每一步已知什么、在求什么。
trick
- 容斥系数的计算式有一些很常见的形式,对应着一些基本的反演类型
- 组合数形式(link-二项式反演)
\(g_n\) 表示至多 \(n\) 个/ \(n\) 种的方案数量,\(f_n\) 恰好 \(n\) 个/\(n\) 种的方案数量
\(g_k\) 表示至少 \(k\) 个/ \(k\) 种的方案数量,\(f_k\) 恰好 \(k\) 个/ \(k\) 种的方案数量
- 倍数形式(link-莫比乌斯反演)
- 集合形式(子集反演)$f(S) = \sum_{T ⊆ S} g(T)⇔g(S) = \sum_{T ⊆ S}(-1)^{|S|-|T|}f(T) $。
例题
\(f[i][j][st]\) 表示在树上 \(i\) 这棵 subtree,对应了图上的 \(st\),且 \(i\) 与 \(j\) 对应的方案数。
如果把 \(i, j\) 的意义反过来定义的话,就没有必要记录 \(st\) 了,但是显然会重复。
所以我们有暴力:
其中 \(a\) 与 \(i\) 相连,\(b\) 与 \(j\) 相连,时间复杂度 \(O(n^3 3^n)\)。
我们肯定是想把 \(st\) 这个瓶颈去掉,那有上面的启示,直接用 \(f[i][j]\),重复的给容斥掉。
直接常规做 \(f[i][j]\) 即在全集内无限制匹配,即“至多在该点集内”的答案。
于是我们枚举可以用的点集 \(st\),对其 \(f\) 计算。
容斥系数 \(f(|st|)\) ?
本质上看,我们要让某一个拥有 \(n\) 个属性的物品只被算 \(1\) 次,然后考虑这个物品被哪些属性集合枚举到:\(\sum_{i=1}^n C_n^i f(i) = 1\)
一个合理的构造:
\((|st|=n)\) 的方案数 - \((|st|=n-1)\) 的方案数 + \((|st|=n-2)\) 的方案数 - \(\cdots\)
那问题就可以在 \(O(n^3 2^n)\) 时间复杂度内解决。

浙公网安备 33010602011771号