OI 容斥原理 学习笔记

10 篇文章 0 订阅
1 篇文章 0 订阅

1 基本形式

∣ ⋃ i = 1 n A i ∣ = ∑ k = 1 n ( − 1 ) k − 1 ∑ 1 ≤ i 1 < i 2 < i 3 < ⋯ < i k ≤ n ∣ A i 1 ∩ A i 2 ∩ A i 3 ∩ ⋯ ∩ A i k ∣ | \bigcup \limits _{i=1} ^n A_i| = \sum \limits _{k=1} ^n (-1)^{k-1} \sum \limits _{1 \leq i_1 < i_2 < i_3 < \dots < i_k \leq n} |A_{i_1} \cap A_{i_2} \cap A_{i_3} \cap \dots \cap A_{i_k}| i=1nAi=k=1n(1)k11i1<i2<i3<<iknAi1Ai2Ai3Aik

1.1 证明

  1. 数学归纳法
  2. 考虑每一个元素 x x x 的贡献

2 应用

2.1 错排

求把 1 − n 1-n 1n 放在 n n n 个位置上,使得 i i i 位置上放的数不是 i i i 的方案数。

2.1.1 递推做法

d n = ( n − 1 ) ( d n − 1 + d n − 2 ) d_n = (n - 1)(d _ {n - 1} + d_{n - 2}) dn=(n1)(dn1+dn2)

思路:考虑第 n n n 个位置上的数放在 x x x 处,分 x x x 放在 n n n 和放在 y   ( y ≠ n ) y\space (y \neq n) y (y=n) 两种情况考虑。

2.1.2 容斥做法

A x A_x Ax i ∈ x ∣ a i = i i \in x | a_i = i ixai=i 的排列集,

a n s = n ! − ∣ A 1 ∪ A 2 ∪ ⋯ ∪ A n ∣ = n ! − ∑ ∣ A { i } ∣ + ∑ ∣ A { i , j } ∣ − ∑ ∣ A { i , j , k } ∣ + … = n ! − ( n 1 ) ( n − 1 ) ! + ( n 2 ) ( n − 2 ) ! − ( n 3 ) ( n − 3 ) ! + … = ∑ i = 2 n ( n i ) ( − 1 ) i ( n − i ) ! \begin{aligned} ans &=n! - |A_1 \cup A_2 \cup \dots \cup A_n |\\ &= n! - \sum |A_{\{i\}}| + \sum |A_{\{i,j\}}| - \sum |A_{\{i,j,k\}}| + \dots \\ &= n! - \binom{n}{{}1} (n-1)! + \binom{n}{2}(n-2)! - \binom{n}{3}(n-3)! +\dots \\ &= \sum \limits _{i=2} ^n \binom{n}{i}(-1)^i(n-i)! \end{aligned} ans=n!A1A2An=n!A{i}+A{i,j}A{i,j,k}+=n!(1n)(n1)!+(2n)(n2)!(3n)(n3)!+=i=2n(in)(1)i(ni)!

2.2 DAG 计数

计算有 n n n 个点的有向无环图(可以不连通)的个数。

2.2.1 做法

有向无环图中,必有至少一个点入度为 0 0 0

A x A_x Ax i ∈ x ∣ i n ( i ) = 0 i \in x | in(i)= 0 ixin(i)=0 的图的集合( i n ( x ) in(x) in(x) 表示 x x x 的入度), B x B_x Bx ∑ A i   ( ∣ i ∣ = x ) \sum A_i \space (|i| = x) Ai (i=x) f ( n ) f(n) f(n) 为题目所求,

f ( n ) = ∣ A 1 ∪ A 2 ∪ ⋯ ∪ A n ∣ = ∑ i = 1 n ( − 1 ) i − 1 C n i B i \begin{aligned} f(n) &= |A_1 \cup A_2 \cup \dots \cup A_n|\\ &= \sum \limits _{i=1} ^n (-1) ^ {i-1} C _{n} ^i B_i \end{aligned} f(n)=A1A2An=i=1n(1)i1CniBi

考虑有 i i i 个点入度为 0 0 0 的情况,将整个图分为入度为 0 0 0 的点和其他点两部分,那么只需要考虑这两部分相连的情况,所以

B i = 2 i ( n − i ) f ( n − i ) B_i = 2 ^{i(n-i)} f(n-i) Bi=2i(ni)f(ni)

代入上面的式子就可以得出

f ( n ) = ∑ i = 1 n ( − 1 ) i − 1 C n i 2 i ( n − i ) f ( n − i ) f(n)=\sum \limits _{i=1} ^n (-1) ^{i-1} C_n ^i 2^{i(n-i)}f(n-i) f(n)=i=1n(1)i1Cni2i(ni)f(ni)

直接递推求解。

3 例题

3.1 CF585E

3.1.1 题意

给定一个整数序列 A 1 , 2 , … , n A_{1,2,\dots,n} A1,2,,n,求:在序列中选出一个集合包含若干个 gcd ⁡ ≠ 1 \gcd \neq 1 gcd=1 的数,再在剩下的数中选一个数 A y A_y Ay 使得 A y A_y Ay 与之前选出的集合中所有数互质的方案数。

n ≤ 5 × 1 0 5 , A i ∈ [ 2 , 1 0 7 ] n \leq 5\times10^5,A_i \in [2,10^7] n5×105,Ai[2,107]

3.1.2 解法

1 考虑只选一些数使得 gcd ≠ 1 \text{gcd} \neq 1 gcd=1

c n t [ x ] cnt[x] cnt[x] 表示序列 A A A x x x 的倍数的个数, B x B_x Bx 表示选出的数集满足 x ∣ gcd ⁡ x|\gcd xgcd 的方案集合。

显然 ∣ B x ∣ = 2 c n t [ x ] − 1 |B_x|=2^{cnt[x]}-1 Bx=2cnt[x]1(不能选空集,所有数取或不取)且 B i j ∈ B i ∪ B j B_{ij} \in B_i \cup B_j BijBiBj B i ∩ B j = B i j B_i \cap B_j = B_{ij} BiBj=Bij

所以有

a n s = ∣ B 2 ∪ B 3 ∪ B 4 ∪ ⋯ ∪ B i n f ∣ = ∣ B 2 ∪ B 3 ∪ B 5 ∪ B 7 ∪ ⋯ ∪ B P l a s t ∣ = ∑ ∣ B P i ∣ − ∑ ∣ B P i P j ∣ + ∑ ∣ B P i P j P k ∣ − … = ∑ x = 2 i n f μ ( x ) ∣ B x ∣ = ∑ x = 2 i n f μ ( x ) ( 2 c n t [ x ] − 1 ) \begin{aligned} ans &= |B_2 \cup B_3 \cup B_4 \cup \dots \cup B_{inf}|\\ &= |B_2 \cup B_3 \cup B_5 \cup B_7 \cup \dots \cup B_{P_{last}}|\\ &= \sum |B_{P_i}| - \sum |B_{P_i P_j}| + \sum |B_{P_i P_j P_k}| - \dots\\ &= \sum \limits _{x=2} ^{inf} \mu (x) |B_x|\\ &= \sum \limits _{x=2} ^{inf} \mu (x) (2 ^{cnt[x]} - 1) \end{aligned} ans=B2B3B4Binf=B2B3B5B7BPlast=BPiBPiPj+BPiPjPk=x=2infμ(x)Bx=x=2infμ(x)(2cnt[x]1)

μ ( x ) \mu (x) μ(x)莫比乌斯函数

2 考虑先选出一个数,再选出符合条件的数的集合

G A i G_{A_i} GAi 表示在除 A i A_i Ai 以外的数中,选出的数集满足 gcd ⁡ ∣ A i \gcd | A_i gcdAi 的个数。

设此时的方案数为 r e s res res,则

r e s = ∑ i = 1 n ( a n s − ∣ G A i ∣ ) ∣ G A i ∣ = ∑ x ∣ A i μ ( x ) ∣ B x ∣ res = \sum \limits _{i=1 } ^n (ans - |G_{A_i}|)\\ |G_{A_i}| = \sum \limits _{x|A_i} \mu (x) |B_x| res=i=1n(ansGAi)GAi=xAiμ(x)Bx

所以

r e s = ∑ i = 1 n a n s − ∑ i = 1 n ∣ G A i ∣ = n ∑ i = 2 i n f μ ( x ) ∣ B x ∣ − ∑ i = 1 n ∑ x > 1 & x ∣ A i μ ( x ) ∣ B x ∣ = n ∑ i = 2 i n f μ ( x ) ∣ B x ∣ − ∑ x = 2 i n f ∑ ∀ i : x ∣ A i μ ( x ) ∣ B x ∣ = ∑ i = 2 i n f μ ( x ) ∣ B x ∣ ( n − c n t [ x ] ) = ∑ i = 2 i n f μ ( x ) ( 2 c n t [ x ] − 1 ) ( n − c n t [ x ] ) \begin {aligned} res &= \sum \limits _{i=1} ^n ans - \sum \limits _{i=1} ^n |G_{A_i}|\\ &= n \sum \limits _{i=2} ^{inf} \mu (x)|B_x| - \sum \limits _{i=1} ^n \sum \limits _{x > 1 \& x | A_i} \mu (x)|B_x|\\ &= n \sum \limits _{i=2} ^{inf} \mu (x)|B_x| - \sum \limits _{x=2} ^{inf} \sum \limits _{\forall i :x |A_i} \mu (x) |B_x|\\ &= \sum \limits _{i=2} ^{inf} \mu (x) |B_x| (n - cnt[x])\\ &= \sum \limits _{i=2} ^{inf} \mu (x) (2 ^{cnt[x]} - 1) (n - cnt[x]) \end {aligned} res=i=1nansi=1nGAi=ni=2infμ(x)Bxi=1nx>1&xAiμ(x)Bx=ni=2infμ(x)Bxx=2infi:xAiμ(x)Bx=i=2infμ(x)Bx(ncnt[x])=i=2infμ(x)(2cnt[x]1)(ncnt[x])

直接递推求解即可,时间复杂度 O ( i n f = 1 0 7 ) O(inf = 10^7) O(inf=107)

3.2 Loj 2541

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值