Skip to content

容斥原理: 组合数学与加减法

Updated: at 12:04

引入

一个班喜欢篮球的有 aa 人, 喜欢足球的有 bb 人,喜欢乒乓球的有 cc 人,请问你至少喜欢一个运动的有多少人?

首先很明显答案不是简单的 a+b+ca + b + c ,因为可能有人既喜欢足球又喜欢篮球,所以全部加起来会把这些人算重。

我们用集合的思路去考虑: 喜欢篮球,足球,乒乓球的人的集合分别是 AABBCC,则我们要求的实际是 ABC|A \cup B \cup C| 。 相比较于A+B+C|A| + |B| + |C|,答案应该把多算了的AB|A \cap B|… 减掉,但是这样就得再把多减掉的ABC|A \cap B \cap C| 加回来,即:

ABC=A+B+CABACBC+ABC|A \cup B \cup C| = |A| + |B| + |C| - |A \cap B| - |A \cap C| - |B \cap C| + |A \cap B \cap C|

定义

UU 中 元素有 nn 种不同的属性,而第 ii 种属性称为 PiP_{i},拥有属性 PiP_{i} 的元素构成集合 SiS_{i},那么

i=1nSi=m=1n(1)m1ai<ai+1i=1mSai\left| \bigcup_{i=1}^{n} S_{i} \right| = \sum_{m=1}^n (-1)^{m-1} \sum_{a_i<a_{i+1}} \left| \bigcap^m_{i=1} S_{a_i} \right|

简单来说就是:奇加偶减 ai<ai+1a_i < a_{i+1} 表示加和时只计算一次。

补集

更常见的一些情况,当你需要计算一些集合的并的时候,根据德摩根律:

i=1nSi=Ui=1nSiˉ\left| \bigcap_{i=1}^n S_i\right| = |U| - \left| \bigcup_{i=1}^n \bar{S_i}\right|

你会发现除去减数刚好适用于容斥定理,从而得到:

i=1nSi=Ui=1nSiˉ=Um=1n(1)m1ai<ai+1i=1mSˉai\left| \bigcap_{i=1}^n S_i\right| = |U| - \left| \bigcup_{i=1}^n \bar{S_i}\right| = |U| - \sum_{m=1}^n (-1)^{m-1} \sum_{a_i<a_{i+1}} \left| \bigcap^m_{i=1} \bar{S}_{a_i} \right|

例题

LCM Plus GCD

给定 x,nx, n。求各元素各不相同的集合(a1,a2,...,ana_1,a_2,...,a_n)的数量,使得lcm(a1,a2,...,ak)+gcd(a1,a2,...ak)=xlcm(a_1,a_2,...,a_k) + gcd(a_1,a_2,...a_k) = x. 1x,n1091 \leq x,n \leq 10^9.

首先能够想到 lcmlcm 一定是 gcdgcd 的倍数,从而 gcdgcdlcmlcm 的因子,也一定是 xx 的因子。从而首先枚举 xx 的因子 factorfactor, 则 lcm=xfactorlcm = x - factor, 每个数都是 xx 的倍数,所以问题变为满足gcd=1,lcm=xfactorfactorgcd = 1,lcm = \frac{x - factor}{factor} 的集合数量。

t=xfactorfactort = \frac{x - factor}{factor} , 从而题目转化为:

给定 x,nx, n。求各元素各不相同的集合(a1,a2,...,ana_1,a_2,...,a_n)的数量,使得lcm(a1,a2,...,an)=tlcm(a_1,a_2,...,a_n) = tgcd(a1,a2,...an)=1gcd(a_1,a_2,...a_n) = 1. 1x,n1091 \leq x,n \leq 10^9.

考虑将 tt 做质因数分解,得到每个质因子的出现次数的集合 SS , t=a1q1+a2q2+...+amqmt = a_1 * q_1 + a_2 * q_2 + ... + a_m * q_m, S={a1,a2,a3,...,am}S = \{a_1, a_2, a_3, ..., a_m\}, mm 为最后一个质因子.

当不保证 gcd=1gcd = 1

这个时候,考虑这 nn 个数的 lcm=tlcm = t,即只要 tt 的每个质因子 qiq_i ,在每个数中,出现次数都不超过 aia_i 次,即每个因子可以在每个数中出现 0vi0 - v_i 次,一共能组合出 P=(v1+1)(v2+1)(v3+1)...(vm+1)=iv(i+1)P = (v_1 + 1)*(v_2 + 1)*(v_3 + 1) ... *(v_m + 1) = \prod_{i \in v} (i + 1) 种,则方案是CPn\mathrm{C}_P^n 种。

保证 gcd=1gcd = 1

考虑这里的方法,此时 UU 对应不保证 gcd=1gcd = 1的答案,从而需要考虑原限制的反,即所有gcd1gcd \neq 1 时的答案的并集 i=1nSiˉ\left| \bigcup_{i=1}^n \bar{S_i}\right|. 考虑如何保证答案的gcd1gcd \neq 1,即保证每个数都一定选取一个指定的因子即可。

所以我们考虑枚举一个 mm 位的二进制数, 哪一位为 11 代表对应那一位的质因子被每个数都选取了。这个时候考虑容斥,你会发现,当刚好有奇数个质因子全被选取的时候,就加上,对应偶数个就减去,刚好对应奇加偶减。 答案的统计也要稍作修改,对应的一定全被选取的那一个质因子的可能性将会从 i+1i+1 次 变为 ii 次(因为一定被选中一次)。

此时统计的答案即为当 lcmlcmtt 的因子,且 gcdgcd11 的集合数量。

保证 lcm=tlcm = t

接下来用完全同样的方法考虑lcmlcm 恰好等于 tt 的情况:

你会发现这就和前半部分一模一样了,这一次二进制数位为1就代表对应的那一位的质因子一定没有被选取到 viv_i 次,从而对应的因子可选取次数又要 1-1

将两次容斥结合在一起,就能得出最后的方案数。

代码参考

未完待续…