容斥原理

广义容斥原理

用于解决收紧限制(恰好 XX/...)与宽松限制(至少 XX/...)之间的转化。

特殊形式:基础容斥原理

设有 \(n\) 个集合 \(A_{1 \sim n}\),下标 \(i_{1 \sim n}\),则:

\[|\cup^{n}_{i=1} A_i| = \sum^n_{k=1} (-1)^{k-1} \sum_{1 \le i_1 < i_2 < ... < i_k \le n} |\cap^k_{j=1} A_{i_j}| \]

(当 \(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}\)

故总贡献为:

\[\sum^{m}_{i=1} (-1)^{i-1}{m \choose i} \]

考虑配凑二项式定理,把这个讨厌的 \(i-1\) 换成 \(i\)

\[\sum^{m}_{i=0} (-1)^{i}{m \choose i} \\ = \sum^{m}_{i=0} {m \choose i} (-1)^i 1^{m-i} \\ = (1-1)^m \\ = 0^m \]

由于 \(m \neq 0\),所以上式 \(=0\)

考察上述两个式子的关系,将两者相加,可以发现后者除了 \(i=0\) 时保留了下来,其余项全部和前者一一抵消。

代入 \(i=0\),可得后者 \(=1\),故两式相加 \(=1\),即:

\[\sum^{m}_{i=1} (-1)^{i-1}{m \choose i} \\ = 1 - \sum^{m}_{i=0} (-1)^{i}{m \choose i} \\ = 1 - 0 \\ = 1 \]

可知 RHS 的总贡献为 \(1\),与 LHS 相等,原命题得证。

广义容斥原理公式

定义

设有 \(n\) 条性质 \(P_{1 \sim n}\)(这通常需要读者依据题目自行刻画,下文的例题将会提到)。

\(\alpha(k)\) 表示恰好满足 \(k\) 条“性质”的元素个数。

\(\beta(k)\) 表示选出 \(k\) 条“性质”后至少满足这 \(k\) 条的元素个数。(注意,此处每个元素的贡献不是 \(1\),而是 \(n \choose k\)

公式

\[\alpha(k) = \sum^{n}_{i=k} (-1)^{i-k} {i \choose k} \beta(k) \]

证明

(以下,\(f_k=\alpha(k),g_k=\beta(k)\)

3

4

例题选讲

读者应当很容易的发现,广义容斥原理的题难点在于 \(f(i)\) 的求取。

  • P10596 BZOJ2839 集合计数(组合计数 & 欧拉降幂技巧

\(g(i)\) 表示 交集元素个数恰好为 \(i\) 的方案数。答案显然是 \(g(K)\)

\(f(i)\) 则表示 交集元素个数至少为 \(i\) 的方案数。

考虑 \(f(i)\) 的计算,显然先选出 \(K\) 个交集元素,然后从剩下 \(N-K\) 个元素中挑选子集的剩下部分,剩下的部分共有 \(2^{N-K}\) 种方案,而每个方案又可以选或者不选,从而拼上那 \(K\) 个元素就可以获得所有的子集方案。故

\[f(i) = 2^{2^{N-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\) 组满足糖果大于药片。分情况转移:

  1. 如果 \(i-1\) 个元素也分了 \(j\) 组,则表明第 \(i\) 个元素的组不满足要求,无贡献。

  2. 如果 \(i-1\) 个元素分了 \(j-1\) 组,则表明第 \(i\) 个元素的组满足要求,需要在 \(b\) 中比他小且没有选过的元素中配对,贡献为 \(cnt_i-(j-1)\),其中 \(cnt_i\) 表示 满足 \(b_j < a_i\)\(j\) 的个数。

故得到转移方程:

\[dp_{i,j} = dp_{i-1,j} + dp_{i-1,j-1} \times (cnt_i-j+1) \]

于是,边界 \(dp_{0,0}=1\)\(f(i) = dp_{n,i} \times (n-i)!\)(其他的还可以随便配嘛),做完了。

总结

到此为止,读者不难得出这种题目的一般做题步骤:

  1. 设计 \(f(i),g(i)\) 的组合意义,明确答案。

  2. 对于组合计数求取 \(f(i)\),一般会将某些元素剔除,然后考虑其他任选的方案。

  3. 对于 dp 求取 \(f(i)\),一般设计前 \(i\) 个 XX / 以 \(i\) 为根的子树内的 XX 的方案数。

  4. 代入公式求得答案即可。

(中间的步骤因题而异,此处只是列举两种常见的方法)

以上。

posted @ 2026-07-26 21:47  _KidA  阅读(31)  评论(0)    收藏  举报