容斥原理
广义容斥原理
用于解决收紧限制(恰好 XX/...)与宽松限制(至少 XX/...)之间的转化。
特殊形式:基础容斥原理
设有 \(n\) 个集合 \(A_{1 \sim n}\),下标 \(i_{1 \sim n}\),则:
(当 \(k=0\),广义容斥原理退化为基础容斥原理,见下文)
证明:
考虑元素 \(x\) 对 LHS 与 RHS 的贡献。
LHS:显然 \(x\) 处于并集中,贡献为 \(1\)。
RHS:假设 \(x\) 恰好被 \(m\) 个集合 \(A_{i_{1 \sim m}}\) 包含。
容易得到对于集合 \(A_{i_1}\),它的贡献是 \(m \choose 1\)(选出这个集合),系数为 \((-1)^{1-1} = (-1)^0 = 1\)。
依此类推,对于集合 \(A_{i_j}\),它的贡献应当是 \(m \choose j\),系数为 \((-1)^{j-1}\)。
故总贡献为:
考虑配凑二项式定理,把这个讨厌的 \(i-1\) 换成 \(i\):
由于 \(m \neq 0\),所以上式 \(=0\)。
考察上述两个式子的关系,将两者相加,可以发现后者除了 \(i=0\) 时保留了下来,其余项全部和前者一一抵消。
代入 \(i=0\),可得后者 \(=1\),故两式相加 \(=1\),即:
可知 RHS 的总贡献为 \(1\),与 LHS 相等,原命题得证。
广义容斥原理公式
定义:
设有 \(n\) 条性质 \(P_{1 \sim n}\)(这通常需要读者依据题目自行刻画,下文的例题将会提到)。
令 \(\alpha(k)\) 表示恰好满足 \(k\) 条“性质”的元素个数。
令 \(\beta(k)\) 表示选出 \(k\) 条“性质”后至少满足这 \(k\) 条的元素个数。(注意,此处每个元素的贡献不是 \(1\),而是 \(n \choose k\))
公式:
证明:
(以下,\(f_k=\alpha(k),g_k=\beta(k)\))


例题选讲
读者应当很容易的发现,广义容斥原理的题难点在于 \(f(i)\) 的求取。
- P10596 BZOJ2839 集合计数(组合计数 & 欧拉降幂技巧)
令 \(g(i)\) 表示 交集元素个数恰好为 \(i\) 的方案数。答案显然是 \(g(K)\)。
\(f(i)\) 则表示 交集元素个数至少为 \(i\) 的方案数。
考虑 \(f(i)\) 的计算,显然先选出 \(K\) 个交集元素,然后从剩下 \(N-K\) 个元素中挑选子集的剩下部分,剩下的部分共有 \(2^{N-K}\) 种方案,而每个方案又可以选或者不选,从而拼上那 \(K\) 个元素就可以获得所有的子集方案。故
这个指数显然过大,可以使用 % MOD-1 的技巧降幂。
- P1450 [HAOI2008] 硬币购物(正难则反思想 & "+1" 处理不合法情形的策略)
严格来说,这并不是广义容斥原理,而是运用了它的思想。
题面长得很像多重背包,但做 \(1000\) 次显然不现实。
考虑反着来,先做一遍完全背包,计算价值为 \(i\) 的方案数 \(dp_i\)。
由于只有 \(4\) 种硬币,考虑枚举所有不合法的状态(共 \(2^4-1=15\) 种)。
对于每种方案,我们钦定为 \(1\) 的那一位超出容量限制,这部分的贡献是 \((d_i+1) \times c_i\)。
最后的不合法方案数即为所有 \(dp_{s-\sum{(d_i+1) \times c_i}}\) 之和,拿 \(dp_s\) 减去它就是答案。
- P4859 已经没有什么好害怕的了(dp 计数 & 排序处理二维偏序关系)
令 \(g(i)\) 表示 糖果大于药片的组恰好为 \(i\) 的方案数。答案显然是 \(g(\frac{N+K}{2})\)(因为这样糖果小于药片的组有 \(\frac{N-K}{2}\) 个,它们俩恰好相差 \(K\))。
\(f(i)\) 则表示 糖果大于药片的组至少为 \(i\) 的方案数。
容易发现直接组合计数是困难的,考虑 dp 计算 \(f(i)\)。
将 \(a_i,b_i\) 从小到大排序(提供 dp 转移的前提),令 \(dp_{i,j}\) 表示前 \(i\) 个元素中有 \(j\) 组满足糖果大于药片。分情况转移:
-
如果 \(i-1\) 个元素也分了 \(j\) 组,则表明第 \(i\) 个元素的组不满足要求,无贡献。
-
如果 \(i-1\) 个元素分了 \(j-1\) 组,则表明第 \(i\) 个元素的组满足要求,需要在 \(b\) 中比他小且没有选过的元素中配对,贡献为 \(cnt_i-(j-1)\),其中 \(cnt_i\) 表示 满足 \(b_j < a_i\) 的 \(j\) 的个数。
故得到转移方程:
于是,边界 \(dp_{0,0}=1\),\(f(i) = dp_{n,i} \times (n-i)!\)(其他的还可以随便配嘛),做完了。
总结
到此为止,读者不难得出这种题目的一般做题步骤:
-
设计 \(f(i),g(i)\) 的组合意义,明确答案。
-
对于组合计数求取 \(f(i)\),一般会将某些元素剔除,然后考虑其他任选的方案。
-
对于 dp 求取 \(f(i)\),一般设计前 \(i\) 个 XX / 以 \(i\) 为根的子树内的 XX 的方案数。
-
代入公式求得答案即可。
(中间的步骤因题而异,此处只是列举两种常见的方法)
以上。
浙公网安备 33010602011771号