容斥原理

容斥原理经常用于许多常见计数问题,往往在普通计数问题上加上某些限制。比如要求n个元素都要满足某种限制。于是我们考虑钦定有0个元素不满足(除了这0个钦定外,剩下元素随意,本质上就是所有元素都任意),减去钦定有1个元素不满足的方案数,加上钦定有2个元素不满足方案数……所求即为所有元素都满足的方案数。容斥系数只需记住第一个必须是1,剩下的就-1 1交替即可。

不定方程非负整数解计数

求解约束方程的整数解个数:x1 + x2 + x3 = 11
( x1, x2, x3 为非负整数,且 x1 <= 3,x2 <= 4,x3 <= 6 )

image

通过比较简单的例题就可以大概感受到容斥原理是什么样子。下面考虑推广到n更大的情况。

给出不定方程 \(\sum_{i=1}^{n} x_{i}=m\)\(n\) 个限制条件 \(x_{i} \leq b_{i}\) ,其中 \(m, b_{i} \in \mathbb{N}\) .求方程的非负整数解的个数.

没有限制时
如果没有 \(x_{i} \leq b_{i}\) 的限制,那么不定方程 \(\sum_{i=1}^{n} x_{i}=m\) 的非负整数解的数目为 \(\binom{m+n-1}{n-1}\)

略证:插板法.
相当于你有 \(m\) 个球要分给 \(n\) 个盒子,允许某个盒子是空的.这个问题不能直接用组合数解决.
于是我们再加入 \(n-1\) 个球,于是问题就变成了在一个长度为 \(m+n-1\) 的球序列中选择 \(n-1\) 个球,然后这个 \(n-1\) 个球把这个序列隔成了 \(n\) 份,恰好可以一对应放到 \(n\) 个盒子中.那么在 \(m+n-1\) 个球中选择 \(n-1\) 个球的方案数就是 \(\binom{m+n-1}{n-1}\)

批注 2026-08-13 091402

一般情况

接着我们尝试抽象出容斥原理的模型:
1.全集 U:不定方程 \(\sum_{i=1}^{n} x_{i}=m\) 的非负整数解
2.元素:变量 \(x_{i}\)
3.属性: \(x_{i}\) 的属性即 \(x_{i}\) 满足的条件,即 \(x_{i} \leq b_{i}\) 的条件
目标:所有变量满足对应属性时集合的大小,即 \(\left|\bigcap_{i=1}^{n} S_{i}\right|\)
这个东西可以用 \(\left|\bigcap_{i=1}^{n} S_{i}\right|=|U|-\left|\bigcup_{i=1}^{n} \overline{S_{i}}\right|\) 求解. \(|U|\) 可以用组合数计算,后半部分自然使用容斥原理展开.

那么问题变成,对于一些 \(\overline{S_{a_{i}}}\) 的交集求大小.考虑 \(S_{a_{i}}\) 的含义,表示 \(x_{a_{i}} \geq b_{a_{i}}+1\) 的解的数目.而交集表示同时满足这些条件.因此这个交集对应的不定方程中,有些变量有下界限制,而有些则没有限制.

能否消除这些下界限制呢?既然要求的是非负整数解,而有些变量的下界又大于 0 ,那么我们直接把这个下界减掉,就可以使得这些变量的下界变成 0,即没有下界啦.因此对于

\[\left|\bigcap_{a_{i}<a_{i 1} 1}^{1 \leq i \leq k} S_{a_{i}}\right| \]

的不定方程形式为

\[\sum_{i=1}^{n} x_{i}=m-\sum_{i=1}^{k}\left(b_{a_{i}}+1\right) \]

于是这个也可以组合数计算啦.这个长度为 \(k\)\(a\) 数组相当于在枚举子集.

解的个数 :

\[\binom{m+n-1}{n-1}-\sum_{\emptyset \neq A \subseteq\{1, \ldots, n\}}(-1)^{|A|+1}\binom{m-\sum_{i \in A}\left(b_{i}+1\right)+n-1}{n-1} \]

由于容斥的过程相当于枚举 \(\{1, \ldots, n\}\) 的子集,因此直接计算的复杂度是 \(O(2^n)\) .


以上复制粘贴自OI-wiki容斥原理

posted @ 2026-08-24 21:02  zhouyiran2011  阅读(6)  评论(0)    收藏  举报