引入
入门例题
假设班里有 10 10 10 个学生喜欢数学,15 15 15 个学生喜欢语文,21 21 21 个学生喜欢编程,班里至少喜欢一门学科的有多少个学生呢?
是 10 + 15 + 21 = 46 10+15+21=46 10 + 15 + 21 = 46 个吗?不是的,因为有些学生可能同时喜欢数学和语文,或者语文和编程,甚至还有可能三者都喜欢.
为了叙述方便,我们把喜欢语文、数学、编程的学生集合分别用 A , B , C A,B,C A , B , C 表示,则学生总数等于 ∣ A ∪ B ∪ C ∣ |A\cup B\cup C| ∣ A ∪ B ∪ C ∣ .刚才已经讲过,如果把这三个集合的元素个数 ∣ A ∣ , ∣ B ∣ , ∣ C ∣ |A|,|B|,|C| ∣ A ∣ , ∣ B ∣ , ∣ C ∣ 直接加起来,会有一些元素重复统计了,因此需要扣掉 ∣ A ∩ B ∣ , ∣ B ∩ C ∣ , ∣ C ∩ A ∣ |A\cap B|,|B\cap C|,|C\cap A| ∣ A ∩ B ∣ , ∣ B ∩ C ∣ , ∣ C ∩ A ∣ ,但这样一来,又有一小部分多扣了,需要加回来,即 ∣ A ∩ B ∩ C ∣ |A\cap B\cap C| ∣ A ∩ B ∩ C ∣ .即
∣ A ∪ B ∪ C ∣ = ∣ A ∣ + ∣ B ∣ + ∣ C ∣ − ∣ A ∩ B ∣ − ∣ B ∩ C ∣ − ∣ C ∩ A ∣ + ∣ A ∩ B ∩ C ∣ |A\cup B\cup C|=|A|+|B|+|C|-|A\cap B|-|B\cap C|-|C\cap A|+|A\cap B\cap C| ∣ A ∪ B ∪ C ∣ = ∣ A ∣ + ∣ B ∣ + ∣ C ∣ − ∣ A ∩ B ∣ − ∣ B ∩ C ∣ − ∣ C ∩ A ∣ + ∣ A ∩ B ∩ C ∣
容斥原理 - venn 图示例
把上述问题推广到一般情况,就是我们熟知的容斥原理.
定义
设 U 中元素有 n 种不同的属性,而第 i 种属性称为 P i P_i P i ,拥有属性 P i P_i P i 的元素构成集合 S i S_i S i ,那么
∣ ⋃ i = 1 n S i ∣ = ∑ i ∣ S i ∣ − ∑ i < j ∣ S i ∩ S j ∣ + ∑ i < j < k ∣ S i ∩ S j ∩ S k ∣ − ⋯ + ( − 1 ) m − 1 ∑ a i < a i + 1 ∣ ⋂ i = 1 m S a i ∣ + ⋯ + ( − 1 ) n − 1 ∣ S 1 ∩ ⋯ ∩ S n ∣ \begin{aligned}
\left|\bigcup_{i=1}^{n}S_i\right|=&\sum_{i}|S_i|-\sum_{i<j}|S_i\cap S_j|+\sum_{i<j<k}|S_i\cap S_j\cap S_k|-\cdots\\
&+(-1)^{m-1}\sum_{a_i<a_{i+1} }\left|\bigcap_{i=1}^{m}S_{a_i}\right|+\cdots+(-1)^{n-1}|S_1\cap\cdots\cap S_n|
\end{aligned} i = 1 ⋃ n S i = i ∑ ∣ S i ∣ − i < j ∑ ∣ S i ∩ S j ∣ + i < j < k ∑ ∣ S i ∩ S j ∩ S k ∣ − ⋯ + ( − 1 ) m − 1 a i < a i + 1 ∑ i = 1 ⋂ m S a i + ⋯ + ( − 1 ) n − 1 ∣ S 1 ∩ ⋯ ∩ S n ∣
即
∣ ⋃ i = 1 n S i ∣ = ∑ m = 1 n ( − 1 ) m − 1 ∑ a i < a i + 1 ∣ ⋂ i = 1 m S a i ∣ \left|\bigcup_{i=1}^{n}S_i\right|=\sum_{m=1}^n(-1)^{m-1}\sum_{a_i<a_{i+1} }\left|\bigcap_{i=1}^mS_{a_i}\right| i = 1 ⋃ n S i = m = 1 ∑ n ( − 1 ) m − 1 a i < a i + 1 ∑ i = 1 ⋂ m S a i
证明
对于每个元素使用二项式定理计算其出现的次数.对于元素 x,假设它出现在 T 1 , T 2 , ⋯ , T m T_1,T_2,\cdots,T_m T 1 , T 2 , ⋯ , T m 的集合中,那么它的出现次数为
C n t = ∣ { T i } ∣ − ∣ { T i ∩ T j ∣ i < j } ∣ + ⋯ + ( − 1 ) k − 1 ∣ { ⋂ i = 1 k T a i ∣ a i < a i + 1 } ∣ + ⋯ + ( − 1 ) m − 1 ∣ { T 1 ∩ ⋯ ∩ T m } ∣ = ( m 1 ) − ( m 2 ) + ⋯ + ( − 1 ) m − 1 ( m m ) = ( m 0 ) − ∑ i = 0 m ( − 1 ) i ( m i ) = 1 − ( 1 − 1 ) m = 1 \begin{aligned}
Cnt=&|\{T_i\}|-|\{T_i\cap T_j|i<j\}|+\cdots+(-1)^{k-1}\left|\left\{\bigcap_{i=1}^{k}T_{a_i}|a_i<a_{i+1}\right\}\right|\\
&+\cdots+(-1)^{m-1}|\{T_1\cap\cdots\cap T_m\}|\\
=&\dbinom{m}{1}-\dbinom{m}{2}+\cdots+(-1)^{m-1}\dbinom{m}{m}\\
=&\dbinom{m}{0}-\sum_{i=0}^m(-1)^i\dbinom{m}{i}\\
=&1-(1-1)^m=1
\end{aligned} C n t = = = = ∣ { T i } ∣ − ∣ { T i ∩ T j ∣ i < j } ∣ + ⋯ + ( − 1 ) k − 1 { i = 1 ⋂ k T a i ∣ a i < a i + 1 } + ⋯ + ( − 1 ) m − 1 ∣ { T 1 ∩ ⋯ ∩ T m } ∣ ( 1 m ) − ( 2 m ) + ⋯ + ( − 1 ) m − 1 ( m m ) ( 0 m ) − i = 0 ∑ m ( − 1 ) i ( i m ) 1 − ( 1 − 1 ) m = 1
于是每个元素出现的次数为 1,那么合并起来就是并集.证毕.
补集
对于全集 U 下的 集合的并 可以使用容斥原理计算,而集合的交则用全集减去 补集的并集 求得:
∣ ⋂ i = 1 n S i ∣ = ∣ U ∣ − ∣ ⋃ i = 1 n S i ‾ ∣ \left|\bigcap_{i=1}^{n}S_i\right|=|U|-\left|\bigcup_{i=1}^n\overline{S_i}\right| i = 1 ⋂ n S i = ∣ U ∣ − i = 1 ⋃ n S i
右边使用容斥即可.
可能接触过容斥的读者都清楚上述内容,而更关心的是容斥的应用.
那么接下来我们给出 3 个层次不同的例题来为大家展示容斥原理的应用.
不定方程非负整数解计数
不定方程非负整数解计数
给出不定方程 ∑ i = 1 n x i = m \sum_{i=1}^nx_i=m ∑ i = 1 n x i = m 和 n n n 个限制条件 x i ≤ b i x_i\leq b_i x i ≤ b i ,其中 m , b i ∈ N m,b_i \in \mathbb{N} m , b i ∈ N . 求方程的非负整数解的个数.
没有限制时
如果没有 x i ≤ b i x_i\leq b_i x i ≤ b i 的限制,那么不定方程 ∑ i = 1 n x i = m \sum_{i=1}^nx_i=m ∑ i = 1 n x i = m 的非负整数解的数目为 ( m + n − 1 n − 1 ) \dbinom{m+n-1}{n-1} ( n − 1 m + n − 1 ) .
略证:插板法.
相当于你有 m m m 个球要分给 n n n 个盒子,允许某个盒子是空的.这个问题不能直接用组合数解决.
于是我们再加入 n − 1 n-1 n − 1 个球,于是问题就变成了在一个长度为 m + n − 1 m+n-1 m + n − 1 的球序列中选择 n − 1 n-1 n − 1 个球,然后这个 n − 1 n-1 n − 1 个球把这个序列隔成了 n n n 份,恰好可以一一对应放到 n n n 个盒子中.那么在 m + n − 1 m+n-1 m + n − 1 个球中选择 n − 1 n-1 n − 1 个球的方案数就是 ( m + n − 1 n − 1 ) \dbinom{m+n-1}{n-1} ( n − 1 m + n − 1 ) .
容斥模型
接着我们尝试抽象出容斥原理的模型:
全集 U:不定方程 ∑ i = 1 n x i = m \sum_{i=1}^nx_i=m ∑ i = 1 n x i = m 的非负整数解
元素:变量 x i x_i x i .
属性:x i x_i x i 的属性即 x i x_i x i 满足的条件,即 x i ≤ b i x_i\leq b_i x i ≤ b i 的条件
目标:所有变量满足对应属性时集合的大小,即 ∣ ⋂ i = 1 n S i ∣ |\bigcap_{i=1}^nS_i| ∣ ⋂ i = 1 n S i ∣ .
这个东西可以用 ∣ ⋂ i = 1 n S i ∣ = ∣ U ∣ − ∣ ⋃ i = 1 n S i ‾ ∣ \left|\bigcap_{i=1}^{n}S_i\right|=|U|-\left|\bigcup_{i=1}^n\overline{S_i}\right| ∣ ⋂ i = 1 n S i ∣ = ∣ U ∣ − ⋃ i = 1 n S i 求解.∣ U ∣ |U| ∣ U ∣ 可以用组合数计算,后半部分自然使用容斥原理展开.
那么问题变成,对于一些 S a i ‾ \overline{S_{a_i}} S a i 的交集求大小.考虑 S a i ‾ \overline{S_{a_i} } S a i 的含义,表示 x a i ≥ b a i + 1 x_{a_i}\geq b_{a_i}+1 x a i ≥ b a i + 1 的解的数目.而交集表示同时满足这些条件.因此这个交集对应的不定方程中,有些变量有 下界限制 ,而有些则没有限制.
能否消除这些下界限制呢?既然要求的是非负整数解,而有些变量的下界又大于 0 0 0 ,那么我们直接 把这个下界减掉 ,就可以使得这些变量的下界变成 0 0 0 ,即没有下界啦.因此对于
∣ ⋂ a i < a i + 1 1 ≤ i ≤ k S a i ∣ \left|\bigcap_{a_i<a_{i+1} }^{1\leq i\leq k}S_{a_i}\right| a i < a i + 1 ⋂ 1 ≤ i ≤ k S a i
的不定方程形式为
∑ i = 1 n x i = m − ∑ i = 1 k ( b a i + 1 ) \sum_{i=1}^nx_i=m-\sum_{i=1}^k(b_{a_i}+1) i = 1 ∑ n x i = m − i = 1 ∑ k ( b a i + 1 )
于是这个也可以组合数计算啦.这个长度为 k k k 的 a a a 数组相当于在枚举子集.
HAOI2008 硬币购物
HAOI2008 硬币购物
4 种面值的硬币,第 i 种的面值是 C i C_i C i .n n n 次询问,每次询问给出每种硬币的数量 D i D_i D i 和一个价格 S S S ,问付款方式.
n ≤ 10 3 , S ≤ 10 5 n\leq 10^3,S\leq 10^5 n ≤ 1 0 3 , S ≤ 1 0 5 .
如果用背包做的话复杂度是 O ( 4 n S ) O(4nS) O ( 4 n S ) ,无法承受.这道题最明显的特点就是硬币一共只有四种.抽象模型,其实就是让我们求方程 ∑ i = 1 4 C i x i = S , x i ≤ D i \sum_{i=1}^4C_ix_i=S,x_i\leq D_i ∑ i = 1 4 C i x i = S , x i ≤ D i 的非负整数解的个数.
采用同样的容斥方式,x i x_i x i 的属性为 x i ≤ D i x_i\leq D_i x i ≤ D i . 套用容斥原理的公式,最后我们要求解
∑ i = 1 4 C i x i = S − ∑ i = 1 k C a i ( D a i + 1 ) \sum_{i=1}^4C_ix_i=S-\sum_{i=1}^kC_{a_i}(D_{a_i}+1) i = 1 ∑ 4 C i x i = S − i = 1 ∑ k C a i ( D a i + 1 )
也就是无限背包问题.这个问题可以预处理,算上询问,总复杂度 O ( 4 S + 2 4 n ) O(4S+2^4n) O ( 4 S + 2 4 n ) .
代码实现
#include <iostream>
using namespace std;
constexpr long long S = 1e5 + 5 ;
long long c[5 ], d[5 ], n, s;
long long f[S];
int main () {
cin.tie (nullptr )->sync_with_stdio (false );
cin >> c[1 ] >> c[2 ] >> c[3 ] >> c[4 ] >> n;
f[0 ] = 1 ;
for (long long j = 1 ; j <= 4 ; j++)
for (long long i = 1 ; i < S; i++)
if (i >= c[j]) f[i] += f[i - c[j]];
for (long long k = 1 ; k <= n; k++) {
cin >> d[1 ] >> d[2 ] >> d[3 ] >> d[4 ] >> s;
long long ans = 0 ;
for (long long i = 1 ; i < 16 ;
i++) {
long long m = s, bit = 0 ;
for (long long j = 1 ; j <= 4 ; j++) {
if ((i >> (j - 1 )) % 2 == 1 ) {
m -= (d[j] + 1 ) * c[j];
bit++;
}
}
if (m >= 0 ) ans += (bit % 2 * 2 - 1 ) * f[m];
}
cout << f[s] - ans << '\n' ;
}
return 0 ;
}
完全图子图染色问题
前面的三道题都是容斥原理的正向运用,这道题则需要用到容斥原理逆向分析.
完全图子图染色问题
A 和 B 喜欢对图(不一定连通)进行染色,而他们的规则是,相邻的结点必须染同一种颜色.今天 A 和 B 玩游戏,对于 n n n 阶 完全图 G = ( V , E ) G=(V,E) G = ( V , E ) .他们定义一个估价函数 F ( S ) F(S) F ( S ) ,其中 S 是边集,S ⊆ E S\subseteq E S ⊆ E .F ( S ) F(S) F ( S ) 的值是对图 G ′ = ( V , S ) G'=(V,S) G ′ = ( V , S ) 用 m m m 种颜色染色的总方案数.他们的另一个规则是,如果 ∣ S ∣ |S| ∣ S ∣ 是奇数,那么 A 的得分增加 F ( S ) F(S) F ( S ) ,否则 B 的得分增加 F ( S ) F(S) F ( S ) . 问 A 和 B 的得分差值.
数学形式
一看这道题的算法趋向并不明显,因此对于棘手的题目首先抽象出数学形式.得分差即为奇偶对称差,可以用 -1 的幂次来作为系数.我们求的是
A n s = ∑ S ⊆ E ( − 1 ) ∣ S ∣ − 1 F ( S ) Ans=\sum_{S\subseteq E}(-1)^{|S|-1}F(S) A n s = S ⊆ E ∑ ( − 1 ) ∣ S ∣ − 1 F ( S )
容斥模型
相邻结点染同一种颜色,我们把它当作属性.在这里我们先不遵守染色的规则,假定我们用 m 种颜色直接对图染色.对于图 G ′ = ( V , S ) G'=(V,S) G ′ = ( V , S ) ,我们把它当作 元素 .属性 x i = x j x_i=x_j x i = x j 的含义是结点 i,j 染同色(注意,并未要求 i,j 之间有连边).
而属性 x i = x j x_i=x_j x i = x j 对应的 集合 定义为 Q i , j Q_{i,j} Q i , j ,其含义是所有满足该属性的图 G ′ G' G ′ 的染色方案,集合的大小就是满足该属性的染色方案数,集合内的元素相当于所有满足该属性的图 G ′ G' G ′ 的染色图.
回到题目,「相邻的结点必须染同一种颜色」,可以理解为若干个 Q Q Q 集合的交集.因此可以写出
F ( S ) = ∣ ⋂ ( i , j ) ∈ S Q i , j ∣ F(S)=\left|\bigcap_{(i,j)\in S}Q_{i,j}\right| F ( S ) = ( i , j ) ∈ S ⋂ Q i , j
上述式子右边的含义就是说对于 S 内的每一条边 ( i , j ) (i,j) ( i , j ) 都满足 x i = x j x_i=x_j x i = x j 的染色方案数,也就是 F ( S ) F(S) F ( S ) .
是不是很有容斥的味道了?由于容斥原理本身没有二元组的形式,因此我们把 所有 的边 ( i , j ) (i,j) ( i , j ) 映射到 T = n ( n + 1 ) 2 T=\frac{n(n+1)}{2} T = 2 n ( n + 1 ) 个整数上,假设将 ( i , j ) (i,j) ( i , j ) 映射为 k , 1 ≤ k ≤ T k,1\leq k\leq T k , 1 ≤ k ≤ T ,同时 Q i , j Q_{i,j} Q i , j 映射为 Q k Q_k Q k . 那么属性 x i = x j x_i=x_j x i = x j 则定义为 P k P_k P k .
同时 S 可以表示为若干个 k 组成的集合,即 S ⟺ K = { k 1 , k 2 , ⋯ , k m } S\iff K=\{k_1,k_2,\cdots,k_m\} S ⟺ K = { k 1 , k 2 , ⋯ , k m } .(也就是说我们在边集与数集间建立了等价关系).
而 E 对应集合 M = { 1 , 2 , ⋯ , n ( n + 1 ) 2 } M=\left\{1,2,\cdots,\frac{n(n+1)}{2}\right\} M = { 1 , 2 , ⋯ , 2 n ( n + 1 ) } . 于是乎
F ( S ) ⟺ F ( { k i } ) = ∣ ⋂ k i Q k i ∣ F(S)\iff F(\{ {k_i}\})=\left|\bigcap_{k_i}Q_{k_i}\right| F ( S ) ⟺ F ({ k i }) = k i ⋂ Q k i
逆向分析
那么要求的式子展开
A n s = ∑ K ⊆ M ( − 1 ) ∣ K ∣ − 1 ∣ ⋂ k i ∈ K Q k i ∣ = ∑ i ∣ Q i ∣ − ∑ i < j ∣ Q i ∩ Q j ∣ + ∑ i < j < k ∣ Q i ∩ Q j ∩ Q k ∣ − ⋯ + ( − 1 ) T − 1 ∣ ⋂ i = 1 T Q i ∣ \begin{aligned}
Ans &= \sum_{K\subseteq M}(-1)^{|K|-1}\left|\bigcap_{k_i\in K}Q_{k_i}\right|\\
&= \sum_{i}|Q_i|-\sum_{i<j}|Q_i\cap Q_j|+\sum_{i<j<k}|Q_i\cap Q_j\cap Q_k|-\cdots+(-1)^{T-1}\left|\bigcap_{i=1}^TQ_i\right|
\end{aligned} A n s = K ⊆ M ∑ ( − 1 ) ∣ K ∣ − 1 k i ∈ K ⋂ Q k i = i ∑ ∣ Q i ∣ − i < j ∑ ∣ Q i ∩ Q j ∣ + i < j < k ∑ ∣ Q i ∩ Q j ∩ Q k ∣ − ⋯ + ( − 1 ) T − 1 i = 1 ⋂ T Q i
于是就出现了容斥原理的展开形式,因此对这个式子逆向推导
A n s = ∣ ⋃ i = 1 T Q i ∣ Ans=\left|\bigcup_{i=1}^TQ_i\right| A n s = i = 1 ⋃ T Q i
再考虑等式右边的含义,只要满足 1 ∼ T 1\sim T 1 ∼ T 任一条件即可,也就是存在两个点同色(不一定相邻)的染色方案数!而我们知道染色方案的全集是 U U U ,显然 ∣ U ∣ = m n |U|=m^n ∣ U ∣ = m n . 而转化为补集,就是求两两异色的染色方案数,即 A m n = m ! ( m − n ) ! A_m^n=\frac{m!}{(m-n)!} A m n = ( m − n )! m ! . 因此
A n s = m n − A m n Ans=m^n-A_m^n A n s = m n − A m n
解决这道题,我们首先抽象出题目数学形式,然后从题目中信息量最大的条件,F ( S ) F(S) F ( S ) 函数的定义入手,将其转化为集合的交并补.然后将式子转化为容斥原理的形式,并 逆向推导 出最终的结果.这道题体现的正是容斥原理的逆用.
数论中的容斥
使用容斥原理能够巧妙地求解一些数论问题.
容斥原理求最大公约数为 k 的数对个数
考虑下面的问题:
求最大公约数为 k k k 的数对个数
设 1 ≤ x , y ≤ N 1 \le x, y \le N 1 ≤ x , y ≤ N ,f ( k ) f(k) f ( k ) 表示最大公约数为 k k k 的有序数对 ( x , y ) (x, y) ( x , y ) 的个数,求 f ( 1 ) f(1) f ( 1 ) 到 f ( N ) f(N) f ( N ) 的值.
这道题固然可以用欧拉函数或莫比乌斯反演的方法来做,但是都不如用容斥原理来的简单.
由容斥原理可以得知,先找到所有以 k k k 为 公约数 的数对,再从中剔除所有以 k k k 的倍数为 公约数 的数对,余下的数对就是以 k k k 为 最大公约数 的数对.即 f ( k ) = f(k)= f ( k ) = 以 k k k 为 公约数 的数对个数 − - − 以 k k k 的倍数为 公约数 的数对个数.
进一步可发现,以 k k k 的倍数为 公约数 的数对个数等于所有以 k k k 的倍数为 最大公约数 的数对个数之和.于是,可以写出如下表达式:
f ( k ) = ⌊ ( N / k ) ⌋ 2 − ∑ i = 2 i ∗ k ≤ N f ( i ∗ k ) f(k)= \lfloor (N/k) \rfloor ^2 - \sum_{i=2}^{i*k \le N} f(i*k) f ( k ) = ⌊( N / k ) ⌋ 2 − i = 2 ∑ i ∗ k ≤ N f ( i ∗ k )
由于当 k > N / 2 k>N/2 k > N /2 时,我们可以直接算出 f ( k ) = ⌊ ( N / k ) ⌋ 2 f(k)= \lfloor (N/k) \rfloor ^2 f ( k ) = ⌊( N / k ) ⌋ 2 ,因此我们可以倒过来,从 f ( N ) f(N) f ( N ) 算到 f ( 1 ) f(1) f ( 1 ) 就可以了.于是,我们使用容斥原理完成了本题.
for (long long k = N; k >= 1 ; k--) {
f[k] = (N / k) * (N / k);
for (long long i = k + k; i <= N; i += k) f[k] -= f[i];
}
上述方法的时间复杂度为 O ( ∑ i = 1 N N / i ) = O ( N ∑ i = 1 N 1 / i ) = O ( N log N ) O( \sum_{i=1}^{N} N/i)=O(N \sum_{i=1}^{N} 1/i)=O(N \log N) O ( ∑ i = 1 N N / i ) = O ( N ∑ i = 1 N 1/ i ) = O ( N log N ) .
附赠三倍经验供大家练手.
容斥原理推导欧拉函数
考虑下面的问题:
欧拉函数公式
求欧拉函数 φ ( n ) \varphi(n) φ ( n ) .其中 φ ( n ) = ∣ { 1 ≤ x ≤ n ∣ gcd ( x , n ) = 1 } ∣ \varphi(n)=|\{1\leq x\leq n|\gcd(x,n)=1\}| φ ( n ) = ∣ { 1 ≤ x ≤ n ∣ g cd( x , n ) = 1 } ∣ .
直接计算是 O ( n log n ) O(n\log n) O ( n log n ) 的,用线性筛是 O ( n ) O(n) O ( n ) 的,杜教筛是 O ( n 2 3 ) O(n^{\frac{2}{3}}) O ( n 3 2 ) 的(话说一道数论入门题用容斥做为什么还要扯到杜教筛上),接下来考虑用容斥推出欧拉函数的公式
判断两个数是否互质,首先分解质因数
n = ∏ i = 1 k p i c i n=\prod_{i=1}^k{p_i}^{c_i} n = i = 1 ∏ k p i c i
那么就要求对于任意 p i p_i p i ,x x x 都不是 p i p_i p i 的倍数,即 p i ∤ x p_i\nmid x p i ∤ x . 把它当作属性,对应的集合为 S i S_i S i ,因此有
φ ( n ) = ∣ ⋂ i = 1 k S i ∣ = ∣ U ∣ − ∣ ⋃ i = 1 k S i ‾ ∣ \varphi(n)=\left|\bigcap_{i=1}^kS_i\right|=|U|-\left|\bigcup_{i=1}^k\overline{S_i}\right| φ ( n ) = i = 1 ⋂ k S i = ∣ U ∣ − i = 1 ⋃ k S i
全集大小 ∣ U ∣ = n |U|=n ∣ U ∣ = n ,而 S i ‾ \overline{S_i} S i 表示的是 p i ∣ x p_i\mid x p i ∣ x 构成的集合,显然 ∣ S i ‾ ∣ = n p i |\overline{S_i}|=\frac{n}{p_i} ∣ S i ∣ = p i n ,并由此推出
∣ ⋂ a i < a i + 1 S a i ∣ = n ∏ p a i \left|\bigcap_{a_i<a_{i+1}}S_{a_i}\right|=\frac{n}{\prod p_{a_i}} a i < a i + 1 ⋂ S a i = ∏ p a i n
因此可得
φ ( n ) = n − ∑ i n p i + ∑ i < j n p i p j − ⋯ + ( − 1 ) k n p 1 p 2 ⋯ p k = n ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p k ) = n ∏ i = 1 k ( 1 − 1 p i ) \begin{aligned}
\varphi(n)&=n-\sum_{i}\frac{n}{p_i}+\sum_{i<j}\frac{n}{p_ip_j}-\cdots+(-1)^k\frac{n}{p_1p_2 \cdots p_k}\\
&=n\left(1-\frac{1}{p_1}\right)\left(1-\frac{1}{p_2}\right)\cdots\left(1-\frac{1}{p_k}\right)\\
&=n\prod_{i=1}^k\left(1-\frac{1}{p_i}\right)
\end{aligned} φ ( n ) = n − i ∑ p i n + i < j ∑ p i p j n − ⋯ + ( − 1 ) k p 1 p 2 ⋯ p k n = n ( 1 − p 1 1 ) ( 1 − p 2 1 ) ⋯ ( 1 − p k 1 ) = n i = 1 ∏ k ( 1 − p i 1 )
这就是欧拉函数的数学表示啦
容斥原理一般化
容斥原理常用于集合的计数问题,而对于两个集合的函数 f ( S ) , g ( S ) f(S),g(S) f ( S ) , g ( S ) ,若
f ( S ) = ∑ T ⊆ S g ( T ) f(S)=\sum_{T\subseteq S}g(T) f ( S ) = T ⊆ S ∑ g ( T )
那么就有
g ( S ) = ∑ T ⊆ S ( − 1 ) ∣ S ∣ − ∣ T ∣ f ( T ) g(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}f(T) g ( S ) = T ⊆ S ∑ ( − 1 ) ∣ S ∣ − ∣ T ∣ f ( T )
证明
接下来我们简单证明一下.我们从等式的右边开始推:
∑ T ⊆ S ( − 1 ) ∣ S ∣ − ∣ T ∣ f ( T ) = ∑ T ⊆ S ( − 1 ) ∣ S ∣ − ∣ T ∣ ∑ Q ⊆ T g ( Q ) = ∑ Q g ( Q ) ∑ Q ⊆ T ⊆ S ( − 1 ) ∣ S ∣ − ∣ T ∣ \begin{aligned}
&\sum_{T\subseteq S}(-1)^{|S|-|T|}f(T)\\
=&\sum_{T\subseteq S}(-1)^{|S|-|T|}\sum_{Q\subseteq T}g(Q)\\
=&\sum_{Q}g(Q)\sum_{Q\subseteq T\subseteq S}(-1)^{|S|-|T|}\\
\end{aligned} = = T ⊆ S ∑ ( − 1 ) ∣ S ∣ − ∣ T ∣ f ( T ) T ⊆ S ∑ ( − 1 ) ∣ S ∣ − ∣ T ∣ Q ⊆ T ∑ g ( Q ) Q ∑ g ( Q ) Q ⊆ T ⊆ S ∑ ( − 1 ) ∣ S ∣ − ∣ T ∣
我们发现后半部分的求和与 Q Q Q 无关,因此把后半部分的 Q Q Q 剔除:
= ∑ Q g ( Q ) ∑ T ⊆ ( S ∖ Q ) ( − 1 ) ∣ S ∖ Q ∣ − ∣ T ∣ =\sum_{Q}g(Q)\sum_{T\subseteq (S\setminus Q)}(-1)^{|S\setminus Q|-|T|} = Q ∑ g ( Q ) T ⊆ ( S ∖ Q ) ∑ ( − 1 ) ∣ S ∖ Q ∣ − ∣ T ∣
记关于集合 P P P 的函数 F ( P ) = ∑ T ⊆ P ( − 1 ) ∣ P ∣ − ∣ T ∣ F(P)=\sum_{T\subseteq P}(-1)^{|P|-|T|} F ( P ) = ∑ T ⊆ P ( − 1 ) ∣ P ∣ − ∣ T ∣ ,并化简这个函数:
F ( P ) = ∑ T ⊆ P ( − 1 ) ∣ P ∣ − ∣ T ∣ = ∑ i = 0 ∣ P ∣ ( ∣ P ∣ i ) ( − 1 ) ∣ P ∣ − i = ∑ i = 0 ∣ P ∣ ( ∣ P ∣ i ) 1 i ( − 1 ) ∣ P ∣ − i = ( 1 − 1 ) ∣ P ∣ = 0 ∣ P ∣ \begin{aligned}
F(P)&=\sum_{T\subseteq P}(-1)^{|P|-|T|}\\
&=\sum_{i=0}^{|P|}\dbinom{|P|}{i}(-1)^{|P|-i}=\sum_{i=0}^{|P|}\dbinom{|P|}{i}1^i(-1)^{|P|-i}\\
&=(1-1)^{|P|}=0^{|P|}
\end{aligned} F ( P ) = T ⊆ P ∑ ( − 1 ) ∣ P ∣ − ∣ T ∣ = i = 0 ∑ ∣ P ∣ ( i ∣ P ∣ ) ( − 1 ) ∣ P ∣ − i = i = 0 ∑ ∣ P ∣ ( i ∣ P ∣ ) 1 i ( − 1 ) ∣ P ∣ − i = ( 1 − 1 ) ∣ P ∣ = 0 ∣ P ∣
因此原来的式子的值是
∑ Q g ( Q ) ∑ T ⊆ ( S ∖ Q ) ( − 1 ) ∣ S ∖ Q ∣ − ∣ T ∣ = ∑ Q g ( Q ) F ( S ∖ Q ) = ∑ Q g ( Q ) ⋅ 0 ∣ S ∖ Q ∣ \sum_{Q}g(Q)\sum_{T\subseteq (S\setminus Q)}(-1)^{|S\setminus Q|-|T|}=\sum_{Q}g(Q)F(S\setminus Q)=\sum_{Q}g(Q)\cdot 0^{|S\setminus Q|} Q ∑ g ( Q ) T ⊆ ( S ∖ Q ) ∑ ( − 1 ) ∣ S ∖ Q ∣ − ∣ T ∣ = Q ∑ g ( Q ) F ( S ∖ Q ) = Q ∑ g ( Q ) ⋅ 0 ∣ S ∖ Q ∣
分析发现,仅当 ∣ S ∖ Q ∣ = 0 |S\setminus Q|=0 ∣ S ∖ Q ∣ = 0 时有 0 0 = 1 0^0=1 0 0 = 1 ,这时 Q = S Q=S Q = S ,对答案的贡献就是 g ( S ) g(S) g ( S ) ,其他时候 0 ∣ S ∖ Q ∣ = 0 0^{|S\setminus Q|}=0 0 ∣ S ∖ Q ∣ = 0 ,则对答案无贡献.于是得到
∑ Q g ( Q ) ⋅ 0 ∣ S ∖ Q ∣ = g ( S ) \sum_{Q}g(Q)\cdot 0^{|S\setminus Q|}=g(S) Q ∑ g ( Q ) ⋅ 0 ∣ S ∖ Q ∣ = g ( S )
综上所述,得证.
推论
该形式还有这样一个推论.在全集 U U U 下,对于函数 f ( S ) , g ( S ) f(S),g(S) f ( S ) , g ( S ) ,如果
f ( S ) = ∑ S ⊆ T g ( T ) f(S)=\sum_{S\subseteq T}g(T) f ( S ) = S ⊆ T ∑ g ( T )
那么
g ( S ) = ∑ S ⊆ T ( − 1 ) ∣ T ∣ − ∣ S ∣ f ( T ) g(S)=\sum_{S\subseteq T}(-1)^{|T|-|S|}f(T) g ( S ) = S ⊆ T ∑ ( − 1 ) ∣ T ∣ − ∣ S ∣ f ( T )
这个推论其实就是补集形式,证法类似.
DAG 计数
DAG 计数
对 n n n 个点带标号的有向无环图进行计数,对 10 9 + 7 10^9+7 1 0 9 + 7 取模.n ≤ 5 × 10 3 n\leq 5\times 10^3 n ≤ 5 × 1 0 3 .
直接 DP
考虑 DP,定义 f [ i , j ] f[i,j] f [ i , j ] 表示 i i i 个点的 DAG,有 j j j 点个入度为 0 0 0 的图的个数.假设去掉这 j j j 个点后,有 k k k 个点入度为 0 0 0 ,那么在去掉前这 k k k 个点至少与这 j j j 个点中的某几个有连边,即 2 j − 1 2^j-1 2 j − 1 种情况;而这 j j j 个点除了与 k k k 个点连边,还可以与剩下的点任意连边,有 2 i − j − k 2^{i-j-k} 2 i − j − k 种情况.因此方程如下:
f [ i , j ] = ( i j ) ∑ k = 1 i − j ( 2 j − 1 ) k 2 ( i − j − k ) j f [ i − j , k ] f[i,j]=\binom{i}{j}\sum_{k=1}^{i-j}(2^j-1)^k2^{(i-j-k)j}f[i-j,k] f [ i , j ] = ( j i ) k = 1 ∑ i − j ( 2 j − 1 ) k 2 ( i − j − k ) j f [ i − j , k ]
计算上式的复杂度是 O ( n 3 ) O(n^3) O ( n 3 ) 的.
放宽限制
上述 DP 的定义是恰好 j j j 个点入度为 0 0 0 , 太过于严格,可以放宽为至少 j j j 个点入度为 0 0 0 .直接定义 f [ i ] f[i] f [ i ] 表示 i i i 个点的 DAG 个数.可以直接容斥.考虑选出的 j j j 个点,这 j j j 个点可以和剩下的 i − j i-j i − j 个点有任意的连边,即 ( 2 i − j ) j = 2 ( i − j ) j \left(2^{i-j}\right)^j=2^{(i-j)j} ( 2 i − j ) j = 2 ( i − j ) j 种情况:
f [ i ] = ∑ j = 1 i ( − 1 ) j − 1 ( i j ) 2 ( i − j ) j f [ i − j ] f[i]=\sum_{j=1}^i(-1)^{j-1}\binom{i}{j}2^{(i-j)j}f[i-j] f [ i ] = j = 1 ∑ i ( − 1 ) j − 1 ( j i ) 2 ( i − j ) j f [ i − j ]
计算上式的复杂度是 O ( n 2 ) O(n^2) O ( n 2 ) 的.
Min-max 容斥
对于满足 全序 关系并且其中元素满足可加减性的序列 { x i } \{x_i\} { x i } ,设其长度为 n n n ,并设 S = { 1 , 2 , 3 , ⋯ , n } S=\{1,2,3,\cdots,n\} S = { 1 , 2 , 3 , ⋯ , n } ,则有:
max i ∈ S x i = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − 1 min j ∈ T x j \max_{i\in S}{x_i}=\sum_{T\subseteq S}{(-1)^{|T|-1}\min_{j\in T}{x_j}} i ∈ S max x i = T ⊆ S ∑ ( − 1 ) ∣ T ∣ − 1 j ∈ T min x j
min i ∈ S x i = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − 1 max j ∈ T x j \min_{i\in S}{x_i}=\sum_{T\subseteq S}{(-1)^{|T|-1}\max_{j\in T}{x_j}} i ∈ S min x i = T ⊆ S ∑ ( − 1 ) ∣ T ∣ − 1 j ∈ T max x j
证明: 考虑做一个到一般容斥原理的映射.对于 x ∈ S x\in S x ∈ S ,假设 x x x 是第 k k k 小的元素.那么我们定义一个映射 f : x ↦ { 1 , 2 , ⋯ , k } f:x\mapsto \{1,2,\cdots,k\} f : x ↦ { 1 , 2 , ⋯ , k } .显然这是一个双射.
那么容易发现,对于 x , y ∈ S x,y\in S x , y ∈ S ,f ( min ( x , y ) ) = f ( x ) ∩ f ( y ) f(\min(x,y))=f(x)\cap f(y) f ( min ( x , y )) = f ( x ) ∩ f ( y ) ,f ( max ( x , y ) ) = f ( x ) ∪ f ( y ) f(\max(x,y))=f(x)\cup f(y) f ( max ( x , y )) = f ( x ) ∪ f ( y ) .因此我们得到:
∣ f ( max i ∈ S x i ) ∣ = ∣ ⋃ i ∈ S f ( x i ) ∣ = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − 1 ∣ ⋂ j ∈ T f ( x j ) ∣ = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − 1 ∣ f ( min j ∈ T x j ) ∣ \begin{aligned}
\left|f\left(\max_{i\in S}{x_i}\right)\right|
&= \left| \bigcup_{i\in S} f(x_i) \right|\\
&= \sum_{T\subseteq S}(-1)^{|T|-1} \left|\bigcap_{j\in T}f(x_j)\right|\\
&= \sum_{T\subseteq S}(-1)^{|T|-1} \left|f\left(\min_{j\in T}{x_j}\right)\right|\\
\end{aligned} f ( i ∈ S max x i ) = i ∈ S ⋃ f ( x i ) = T ⊆ S ∑ ( − 1 ) ∣ T ∣ − 1 j ∈ T ⋂ f ( x j ) = T ⊆ S ∑ ( − 1 ) ∣ T ∣ − 1 f ( j ∈ T min x j )
然后再把 ∣ f ( max i ∈ S x i ) ∣ \left|f\left(\max_{i\in S}{x_i}\right)\right| ∣ f ( max i ∈ S x i ) ∣ 映射回 max i ∈ S x i \max_{i\in S}{x_i} max i ∈ S x i ,而 min \min min 是类似的.
证毕.
但是你可能觉得这个式子非常蠢,最大值明明可以直接求.之所以 min-max 容斥这么重要,是因为它在期望上也是成立的,即:
E ( max i ∈ S x i ) = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − 1 E ( min j ∈ T x j ) E\left(\max_{i\in S}{x_i}\right)=\sum_{T\subseteq S}{(-1)^{|T|-1}E\left(\min_{j\in T}{x_j} \right)} E ( i ∈ S max x i ) = T ⊆ S ∑ ( − 1 ) ∣ T ∣ − 1 E ( j ∈ T min x j )
E ( min i ∈ S x i ) = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − 1 E ( max j ∈ T x j ) E\left(\min_{i\in S}{x_i}\right)=\sum_{T\subseteq S}{(-1)^{|T|-1}E\left(\max_{j\in T}{x_j} \right)} E ( i ∈ S min x i ) = T ⊆ S ∑ ( − 1 ) ∣ T ∣ − 1 E ( j ∈ T max x j )
证明: 我们考虑计算期望的一种方法:
E ( max i ∈ S x i ) = ∑ y P ( y = x ) max j ∈ S y j E\left(\max_{i\in S}{x_i}\right)=\sum_{y}{P(y=x)\max_{j\in S}{y_j}} E ( i ∈ S max x i ) = y ∑ P ( y = x ) j ∈ S max y j
其中 y y y 是一个长度为 n n n 的序列.
我们对后面的 max \max max 使用之前的式子:
E ( max i ∈ S x i ) = ∑ y P ( y = x ) max j ∈ S y j = ∑ y P ( y = x ) ∑ T ⊆ S ( − 1 ) ∣ T ∣ − 1 min j ∈ T y j \begin{aligned}E\left(\max_{i\in S}{x_i}\right)&=\sum_{y}{P(y=x)\max_{j\in S}{y_j}}\\
&=\sum_{y}{P(y=x)\sum_{T\subseteq S}{(-1)^{|T|-1}\min_{j\in T}{y_j}}} \end{aligned} E ( i ∈ S max x i ) = y ∑ P ( y = x ) j ∈ S max y j = y ∑ P ( y = x ) T ⊆ S ∑ ( − 1 ) ∣ T ∣ − 1 j ∈ T min y j
调换求和顺序:
E ( max i ∈ S x i ) = ∑ y P ( y = x ) ∑ T ⊆ S ( − 1 ) ∣ T ∣ − 1 min j ∈ T y j = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − 1 ∑ y P ( y = x ) min j ∈ T y j = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − 1 E ( min j ∈ T y j ) \begin{aligned}E\left(\max_{i\in S}{x_i}\right)
&=\sum_{y}{P(y=x)\sum_{T\subseteq S}{(-1)^{|T|-1}\min_{j\in T}{y_j}}}\\
&=\sum_{T\subseteq S}{(-1)^{|T|-1}\sum_y{P(y=x)\min_{j\in T}{y_j}}}\\
&=\sum_{T\subseteq S}{(-1)^{|T|-1}E\left(\min_{j\in T}{y_j}\right)} \end{aligned} E ( i ∈ S max x i ) = y ∑ P ( y = x ) T ⊆ S ∑ ( − 1 ) ∣ T ∣ − 1 j ∈ T min y j = T ⊆ S ∑ ( − 1 ) ∣ T ∣ − 1 y ∑ P ( y = x ) j ∈ T min y j = T ⊆ S ∑ ( − 1 ) ∣ T ∣ − 1 E ( j ∈ T min y j )
min \min min 是类似的.
证毕.
还有更强的:
kthmax x i i ∈ S = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − k ( ∣ T ∣ − 1 k − 1 ) min j ∈ T x j \underset{i\in S}{\operatorname{kthmax}{x_i}}=\sum_{T\subseteq S}{(-1)^{|T|-k}\dbinom {|T|-1}{k-1}\min_{j\in T}{x_j}} i ∈ S kthmax x i = T ⊆ S ∑ ( − 1 ) ∣ T ∣ − k ( k − 1 ∣ T ∣ − 1 ) j ∈ T min x j
kthmin x i i ∈ S = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − k ( ∣ T ∣ − 1 k − 1 ) max j ∈ T x j \underset{i\in S}{\operatorname{kthmin}{x_i}}=\sum_{T\subseteq S}{(-1)^{|T|-k}\dbinom {|T|-1}{k-1}\max_{j\in T}{x_j}} i ∈ S kthmin x i = T ⊆ S ∑ ( − 1 ) ∣ T ∣ − k ( k − 1 ∣ T ∣ − 1 ) j ∈ T max x j
E ( kthmax x i i ∈ S ) = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − k ( ∣ T ∣ − 1 k − 1 ) E ( min j ∈ T x j ) E\left(\underset{i\in S}{\operatorname{kthmax}{x_i}}\right)=\sum_{T\subseteq S}{(-1)^{|T|-k}\dbinom {|T|-1}{k-1}E\left(\min_{j\in T}{x_j}\right)} E ( i ∈ S kthmax x i ) = T ⊆ S ∑ ( − 1 ) ∣ T ∣ − k ( k − 1 ∣ T ∣ − 1 ) E ( j ∈ T min x j )
E ( kthmin x i i ∈ S ) = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − k ( ∣ T ∣ − 1 k − 1 ) E ( max j ∈ T x j ) E\left(\underset{i\in S}{\operatorname{kthmin}{x_i}}\right)=\sum_{T\subseteq S}{(-1)^{|T|-k}\dbinom {|T|-1}{k-1}E\left(\max_{j\in T}{x_j}\right)} E ( i ∈ S kthmin x i ) = T ⊆ S ∑ ( − 1 ) ∣ T ∣ − k ( k − 1 ∣ T ∣ − 1 ) E ( j ∈ T max x j )
规定若 n < m n< m n < m ,则 ( n m ) = 0 \dbinom nm=0 ( m n ) = 0 .
证明: 不妨设 ∀ 1 ≤ i < n , x i ≤ x i + 1 \forall 1\le i<n,x_i\le x_{i+1} ∀1 ≤ i < n , x i ≤ x i + 1 .则有:
∑ T ⊆ S ( − 1 ) ∣ T ∣ − k ( ∣ T ∣ − 1 k − 1 ) min j ∈ T x j = ∑ i ∈ S x i ∑ T ⊆ S ( − 1 ) ∣ T ∣ − k ( ∣ T ∣ − 1 k − 1 ) [ x i = min j ∈ T x j ] = ∑ i ∈ S x i ∑ j = k n ( n − i j − 1 ) ( j − 1 k − 1 ) ( − 1 ) j − k \begin{aligned}
\sum_{T\subseteq S}{(-1)^{|T|-k}\dbinom {|T|-1}{k-1}\min_{j\in T}{x_j}}
&=\sum_{i\in S}{x_i\sum_{T\subseteq S}{(-1)^{|T|-k}\dbinom {|T|-1}{k-1}\left[x_i=\min_{j\in T}{x_j} \right]}}\\
&=\sum_{i\in S}{x_i\sum_{j=k}^n{\dbinom {n-i}{j-1}\dbinom {j-1}{k-1}(-1)^{j-k}}}
\end{aligned} T ⊆ S ∑ ( − 1 ) ∣ T ∣ − k ( k − 1 ∣ T ∣ − 1 ) j ∈ T min x j = i ∈ S ∑ x i T ⊆ S ∑ ( − 1 ) ∣ T ∣ − k ( k − 1 ∣ T ∣ − 1 ) [ x i = j ∈ T min x j ] = i ∈ S ∑ x i j = k ∑ n ( j − 1 n − i ) ( k − 1 j − 1 ) ( − 1 ) j − k
又因为有组合恒等式:( a b ) ( b c ) = ( a c ) ( a − c b − c ) \dbinom ab\dbinom bc=\dbinom ac\dbinom {a-c}{b-c} ( b a ) ( c b ) = ( c a ) ( b − c a − c ) ,所以有:
∑ T ⊆ S ( − 1 ) ∣ T ∣ − k ( ∣ T ∣ − 1 k − 1 ) min j ∈ T x j = ∑ i ∈ S x i ∑ j = k n ( n − i j − 1 ) ( j − 1 k − 1 ) ( − 1 ) j − k = ∑ i ∈ S x i ∑ j = k n ( n − i k − 1 ) ( n − i − k + 1 j − k ) ( − 1 ) j − k = ∑ i ∈ S ( n − i k − 1 ) x i ∑ j = k n ( n − i − k + 1 j − k ) ( − 1 ) j − k = ∑ i ∈ S ( n − i k − 1 ) x i ∑ j = 0 n − i − k + 1 ( n − i − k + 1 j ) ( − 1 ) j \begin{aligned}
\sum_{T\subseteq S}{(-1)^{|T|-k}\dbinom {|T|-1}{k-1}\min_{j\in T}{x_j}}
&=\sum_{i\in S}{x_i\sum_{j=k}^n{\dbinom {n-i}{j-1}\dbinom {j-1}{k-1}(-1)^{j-k}}}\\
&=\sum_{i\in S}{x_i\sum_{j=k}^n{\dbinom {n-i}{k-1}\dbinom {n-i-k+1}{j-k}(-1)^{j-k}}}\\
&=\sum_{i\in S}{\dbinom {n-i}{k-1}x_i\sum_{j=k}^n{\dbinom {n-i-k+1}{j-k}(-1)^{j-k}}}\\
&=\sum_{i\in S}{\dbinom {n-i}{k-1}x_i\sum_{j=0}^{n-i-k+1}{\dbinom {n-i-k+1}j(-1)^{j}}}
\end{aligned} T ⊆ S ∑ ( − 1 ) ∣ T ∣ − k ( k − 1 ∣ T ∣ − 1 ) j ∈ T min x j = i ∈ S ∑ x i j = k ∑ n ( j − 1 n − i ) ( k − 1 j − 1 ) ( − 1 ) j − k = i ∈ S ∑ x i j = k ∑ n ( k − 1 n − i ) ( j − k n − i − k + 1 ) ( − 1 ) j − k = i ∈ S ∑ ( k − 1 n − i ) x i j = k ∑ n ( j − k n − i − k + 1 ) ( − 1 ) j − k = i ∈ S ∑ ( k − 1 n − i ) x i j = 0 ∑ n − i − k + 1 ( j n − i − k + 1 ) ( − 1 ) j
当 i = n − k + 1 i=n-k+1 i = n − k + 1 时:
( n − i k − 1 ) ∑ j = 0 n − i − k + 1 ( n − i − k + 1 j ) ( − 1 ) j = 1 \dbinom {n-i}{k-1}\sum_{j=0}^{n-i-k+1}{\dbinom {n-i-k+1}j(-1)^{j}}=1 ( k − 1 n − i ) j = 0 ∑ n − i − k + 1 ( j n − i − k + 1 ) ( − 1 ) j = 1
否则:
( n − i k − 1 ) ∑ j = 0 n − i − k + 1 ( n − i − k + 1 j ) ( − 1 ) j = 0 \dbinom {n-i}{k-1}\sum_{j=0}^{n-i-k+1}{\dbinom {n-i-k+1}j(-1)^{j}}=0 ( k − 1 n − i ) j = 0 ∑ n − i − k + 1 ( j n − i − k + 1 ) ( − 1 ) j = 0
所以:
∑ i ∈ S ( n − i k − 1 ) x i ∑ j = 0 n − i − k + 1 ( n − i − k + 1 j ) ( − 1 ) j = kthmax i ∈ S x i \sum_{i\in S}{\dbinom {n-i}{k-1}x_i\sum_{j=0}^{n-i-k+1}{\dbinom {n-i-k+1}j(-1)^{j}}}=\underset{i\in S}{\operatorname{kthmax}}{x_i} i ∈ S ∑ ( k − 1 n − i ) x i j = 0 ∑ n − i − k + 1 ( j n − i − k + 1 ) ( − 1 ) j = i ∈ S kthmax x i
剩下三个是类似的.
证毕.
根据 min-max 容斥,我们还可以得到下面的式子:
lcm i ∈ S x i = ∏ T ⊆ S ( gcd j ∈ T x j ) ( − 1 ) ∣ T ∣ − 1 \underset{i\in S}{\operatorname{lcm}}{x_i}=\prod_{T\subseteq S}{\left(\gcd_{j\in T}{x_j} \right)^{(-1)^{|T|-1}}} i ∈ S lcm x i = T ⊆ S ∏ ( j ∈ T g cd x j ) ( − 1 ) ∣ T ∣ − 1
因为 lcm , gcd , a 1 , a − 1 \operatorname{lcm},\gcd,a^{1},a^{-1} lcm , g cd, a 1 , a − 1 分别相当于 max , min , + , − \max,\min,+,- max , min , + , − ,就是说相当于对于指数做了一个 min-max 容斥,自然就是对的了
PKUWC2018 随机游走
PKUWC2018 随机游走
给定一棵 n n n 个点的树,你从 x x x 出发,每次等概率随机选择一条与所在点相邻的边走过去.
有 Q Q Q 次询问.每次询问给出一个集合 S S S ,求如果从 x x x 出发一直随机游走,直到点集 S S S 中的点都至少经过一次的话,期望游走几步.
特别地,点 x x x (即起点)视为一开始就被经过了一次.
对 998244353 998244353 998244353 取模.
1 ≤ n ≤ 18 , 1 ≤ Q ≤ 5000 , 1 ≤ ∣ S ∣ ≤ n 1\le n\le 18,1\le Q\le 5000,1\le |S|\le n 1 ≤ n ≤ 18 , 1 ≤ Q ≤ 5000 , 1 ≤ ∣ S ∣ ≤ n .
期望游走的步数也就是游走的时间.那么设随机变量 x i x_i x i 表示第一次走到结点 i i i 的时间.那么我们要求的就是
E ( max i ∈ S x i ) E\left(\max_{i\in S}x_i\right) E ( i ∈ S max x i )
使用 min-max 容斥可以得到
E ( max i ∈ S x i ) = E ( ∑ T ⊆ S ( − 1 ) ∣ T ∣ − 1 min i ∈ T x i ) = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − 1 E ( min i ∈ T x i ) E\left(\max_{i\in S}x_i\right)
=E\left(\sum_{T\subseteq S}(-1)^{|T|-1}\min_{i\in T}x_i\right)
=\sum_{T\subseteq S}(-1)^{|T|-1}E\left(\min_{i\in T}x_i\right) E ( i ∈ S max x i ) = E ( T ⊆ S ∑ ( − 1 ) ∣ T ∣ − 1 i ∈ T min x i ) = T ⊆ S ∑ ( − 1 ) ∣ T ∣ − 1 E ( i ∈ T min x i )
对于一个集合 T ∈ [ n ] T\in[n] T ∈ [ n ] ,考虑求出 F ( T ) = E ( min i ∈ T x i ) F(T)=E(\min_{i\in T}x_i) F ( T ) = E ( min i ∈ T x i ) .
考虑 E ( min i ∈ T x i ) E(\min_{i\in T}x_i) E ( min i ∈ T x i ) 的含义,是第一次走到 T T T 中某一个点的期望时间.不妨设 f ( i ) f(i) f ( i ) 表示从结点 i i i 出发,第一次走到 T T T 中某个结点的期望时间.
对于 i ∈ T i\in T i ∈ T ,有 f ( i ) = 0 f(i)=0 f ( i ) = 0 .
对于 i ∉ T i\notin T i ∈ / T ,有 f ( i ) = 1 + 1 deg ( i ) ∑ ( i , j ) ∈ E f ( j ) f(i)=1+\frac{1}{\text{deg}(i)}\sum_{(i,j)\in E}f(j) f ( i ) = 1 + deg ( i ) 1 ∑ ( i , j ) ∈ E f ( j ) .
如果直接高斯消元,复杂度 O ( n 3 ) O(n^3) O ( n 3 ) .那么我们对每个 T T T 都计算 F ( T ) F(T) F ( T ) 的总复杂度就是 O ( 2 n n 3 ) O(2^nn^3) O ( 2 n n 3 ) ,不能接受.我们使用树上消元的技巧.
不妨设根结点是 1 1 1 ,结点 u u u 的父亲是 p u p_u p u .对于叶子结点 i i i ,f ( i ) f(i) f ( i ) 只会和 i i i 的父亲有关(也可能 f ( i ) = 0 f(i)=0 f ( i ) = 0 ,那样更好).因此我们可以把 f ( i ) f(i) f ( i ) 表示成 f ( i ) = A i + B i f ( p i ) f(i)=A_i+B_if(p_i) f ( i ) = A i + B i f ( p i ) 的形式,其中 A i , B i A_i,B_i A i , B i 可以快速计算.
对于非叶结点 i i i ,考虑它的儿子序列 j 1 , ⋯ , j k j_1,\cdots,j_k j 1 , ⋯ , j k .由于 f ( j e ) = A j e + B j e f ( i ) f(j_e)=A_{j_e}+B_{j_e}f(i) f ( j e ) = A j e + B j e f ( i ) .因此可以得到
f ( i ) = 1 + 1 deg ( i ) ∑ e = 1 k ( A j e + B j e f ( i ) ) + f ( p i ) deg ( i ) f(i)=1+\frac{1}{\deg(i)}\sum_{e=1}^k\left(A_{j_e}+B_{j_e}f(i)\right)+\frac{f(p_i)}{\deg(i)} f ( i ) = 1 + deg ( i ) 1 e = 1 ∑ k ( A j e + B j e f ( i ) ) + deg ( i ) f ( p i )
那么变换一下可以得到
f ( i ) = deg ( i ) + ∑ e = 1 k A j e deg ( i ) − ∑ e = 1 k B j e + f ( p i ) deg ( i ) − ∑ e = 1 k B j e f(i)=\frac{\deg(i)+\sum_{e=1}^kA_{j_e}}{\deg(i)-\sum_{e=1}^kB_{j_e}}+
\frac{f(p_i)}{\deg(i)-\sum_{e=1}^kB_{j_e}} f ( i ) = deg ( i ) − ∑ e = 1 k B j e deg ( i ) + ∑ e = 1 k A j e + deg ( i ) − ∑ e = 1 k B j e f ( p i )
于是我们把 f ( i ) f(i) f ( i ) 也写成了 A i + B i f ( p i ) A_i+B_if(p_i) A i + B i f ( p i ) 的形式.这样可以一直倒推到根结点.而根结点没有父亲.也就是说
f ( 1 ) = deg ( 1 ) + ∑ e = 1 k A j e deg ( 1 ) − ∑ e = 1 k B j e f(1)=\frac{\deg(1)+\sum_{e=1}^kA_{j_e}}{\deg(1)-\sum_{e=1}^kB_{j_e}} f ( 1 ) = deg ( 1 ) − ∑ e = 1 k B j e deg ( 1 ) + ∑ e = 1 k A j e
解一下这个方程我们就得到了 f ( 1 ) f(1) f ( 1 ) ,再从上往下推一次就得到了每个点的 f ( i ) f(i) f ( i ) .那么 F ( T ) = f ( x ) F(T)=f(x) F ( T ) = f ( x ) .时间复杂度 O ( n ) O(n) O ( n ) .
这样,我们可以对于每一个 T T T 计算出 F ( T ) F(T) F ( T ) ,时间复杂度 O ( 2 n n ) O(2^nn) O ( 2 n n ) .
回到容斥的部分,我们知道 E ( max i ∈ S x i ) = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − 1 F ( T ) E(\max_{i\in S}x_i)=\sum_{T\subseteq S}(-1)^{|T|-1}F(T) E ( max i ∈ S x i ) = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − 1 F ( T ) .
不妨设 F ′ ( T ) = ( − 1 ) ∣ T ∣ − 1 F ( T ) F'(T)=(-1)^{|T|-1}F(T) F ′ ( T ) = ( − 1 ) ∣ T ∣ − 1 F ( T ) ,那么进一步得到 E ( max i ∈ S x i ) = ∑ T ⊆ S F ′ ( T ) E(\max_{i\in S}x_i)=\sum_{T\subseteq S}F'(T) E ( max i ∈ S x i ) = ∑ T ⊆ S F ′ ( T ) .因此可以使用 FMT(也叫子集前缀和,或者 FWT 或变换)在 O ( 2 n n ) O(2^nn) O ( 2 n n ) 的时间内对每个 S S S 计算出 E ( max i ∈ S x i ) E(\max_{i\in S}x_i) E ( max i ∈ S x i ) ,这样就可以 O ( 1 ) O(1) O ( 1 ) 回答询问了.
习题
参考文献
浅探容斥原理 - 王迪 ,2013 年信息学奥林匹克中国国家队候选队员论文集
有标号的 DAG 计数系列问题 - Cyhlnj
全序关系 - Wikipedia