[学习笔记]容斥?反演?
作者:互联网
部分内容也是 2013 年国家集训队论文《浅谈容斥原理》[1]中的。还有一些来源于《炫酷反演魔术》[2]。另外有一些来源于 \(\sf Quack\) 的课件,最后还有一些杂烂文章就是来源于我自己了......
不一定完结,随机更新。
基本容斥
假设有 \(n\) 个性质 \(P_1,P_2,\cdots,P_n\),在全集 \(U\) 中满足这些性质的元素分别为 \(S_1,S_2,\cdots,S_n\).
最基本的容斥形式如下:
\[\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)^{n-1}|S_1\cap S_2\cap S_3\cdots \cap S_n| \]考虑一个属于 \(T_1,T_2\cdots,T_m\) 的元素会被计算多少次:
\[\sum_{i=1}^m (-1)^{i-1}{m\choose i}=-\brak{(1-1)^m-1}=1 \]然后,我们可以稍加推广,得到另外的一个形式:
\[\norm{\bigcap_{i=1}^n S_i}=\norm U-\norm{\bigcup_{i=1}^n \bar{S_i}} \]举个例子:错位排列。
对于性质 \(P_i\),其表示 \(\sigma_i\neq i\),而我们的目标是求 \(\displaystyle \norm{\bigcap_{i=1}^n S_i}\),根据上面的容斥形式,需要用到 \(\bar{S_i}\),其表示满足 \(\sigma_i=i\) 的所有排列,此时我们可以进行容斥了:
\[\begin{aligned} \norm{\bigcap_{i=1}^n S_i}&=\norm U-\norm{\bigcup_{i=1}^n \bar{S_i}} \\ &=n!-\sum_{t=1}^n(-1)^{t-1}\sum_{i_1<i_2<i_3\cdots<i_t}\norm{\bigcap_{k=1}^t S_{i_k}} \\ &=n!-\sum_{t=1}^n(-1)^{t-1}\sum_{i_1<i_2<i_3\cdots<i_t}(n-t)! \\ &=n!-\sum_{t=1}^n(-1)^{t-1}{n\choose t}(n-t)! \\ &=n!-\sum_{t=1}^n(-1)^{t-1}\frac{n!}{t!} \\ &=n!+\sum_{t=1}^n(-1)^t\frac{n!}{t!} \\ &=n!\sum_{t=0}^n(-1)^t\frac{n!}{t!} \\ \end{aligned} \]化简的关键在于我们发现无论取多少个集合的交,交的大小都只和集合个数有关,这也是错排的通项公式是非指数级的关键。
二项式反演
前面的公式,其核心还是最开始那个证明的式子:
\[\sum_{i=1}^m (-1)^{i-1}{m\choose i}=-\brak{(1-1)^m-1}=1 \]如果你再细心一点,将会发现,同一行的组合数交错和为 \(0\),即:
\[\sum_{i=0}^m (-1)^i{m\choose i}=0 \]严谨地,实际上
\[\sum_{i=0}^m (-1)^i{m\choose i}=[m=0] \]再来看看前面的错排,如果设 \(f(n)\) 表示任意一个排列方案数,\(g(n)\) 表示满足了 \(P\) 中的 \(n\) 个的方案数,那么,我们枚举到底是哪 \(n\) 个错开,就可以由 \(g\) 得到 \(f\):
\[f(n)=\sum_{i=0}^n{n\choose i}g(i) \]现在的问题是:\(f(n)=n!\),而 \(g(n)\) 不知道,也就是说,我们想要从 \(f\) 推到 \(g\),但是目前只能由 \(g\) 得到 \(f\).
但是没有关系,推一推式子,设 \(\displaystyle g(n)=\sum_{i=0}^n{n\choose i}\lambda(i)f(i)\),其中 \(\lambda(i)\) 表示容斥系数,那么
\[\begin{aligned} g(n)&=\sum_{i=0}^n\lambda(i){n\choose i}\sum_{j=0}^i{i\choose j}g(j) \\ &=\sum_{i=0}^n\sum_{j=0}^i\lambda(i){n\choose i}{i\choose j}g(j) \\ &=\sum_{i=0}^n\sum_{j=0}^i\lambda(i){n\choose j}{n-j\choose i-j}g(j) \\ &=\sum_{j=0}^n{n\choose j}\sum_{i=j}^n\lambda(i){n-j\choose i-j}g(j) \end{aligned} \]然后就会发现,需要满足 \(\displaystyle {n\choose j}\sum_{i=j}^n\lambda(i){n-j\choose i-j}=[j=n]=[n-j=0]\),显然 \(\displaystyle{n\choose j}\neq 0(j\in [0,n]\cap\Z)\),因此,\(\displaystyle \sum_{i=j}^n\lambda(i){n-j\choose i-j}=[j=n]=[n-j=0]\),于是:
\[\displaystyle \sum_{i=j}^n\lambda(i){n-j\choose i-j}=\sum_{i=0}^{n-j}(-1)^i{n-j\choose i} \\ \Rightarrow \sum_{i=0}^{n-j}\lambda(i+j){n-j\choose i}=\sum_{i=0}^{n-j}(-1)^i{n-j\choose i} \]因此,\(\lambda(i+j)=(-1)^i\),即 \(\lambda(i)=(-1)^{i-j}\),你发现消不了 \(-j\) 这一项,但是没有关系,可以将右边的 \((-1)^i\) 改写成 \((-1)^{n-j-i}\),此时你会发现 \(\lambda(i+j)=(-1)^{n-i-j}\),因此 \(\lambda(i)=(-1)^{n-i}\).
其实还有更简单的证明:
\[f(n)=\sum_{i=0}^n\frac{n!}{i!(n-i)!}g(i)\Rightarrow\frac{f(n)}{n!}=\sum_{i=0}^n\frac{g(i)}{i!}\times \frac{1}{(n-i)!} \]因此,有
\[\hat F=\hat G\times e^x\Rightarrow \hat G=\hat F\times e^{-x}\Rightarrow \frac{g(n)}{n!}=\sum_{i=0}^n\frac{(-1)^{n-i}}{(n-i)!}\frac{f(i)}{i!}\Rightarrow g(n)=\sum_{i=0}^n(-1)^{n-i}{n\choose i}f(i) \]
两步解决(
至此,我们得到了二项式反演的一个形式:
\[f(n)=\sum_{i=0}^n{n\choose i}g(i)\Leftrightarrow g(n)=\sum_{i=0}^{n}(-1)^{n-i}{n\choose i}f(i) \]另外一个形式:
\[f(n)=\sum_{i=0}^n(-1)^i{n\choose i}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^i{n\choose i}f(i) \]数论中的容斥原理
考察 \(\varphi(n)=\norm{\set{x|1\le x\le n\land\gcd(x,n)=1}}\),要计算 \(\varphi(n)\),我们可以用 \(\displaystyle n=\prod_{i=1}^c p_i^{t_i}\) 中 \(n\) 的所有质因子来进行容斥 —— 因为所谓 \(\gcd(x,n)=1\),实际上就是 \(x\) 不含有任何一个 \(p_i\),定义性质 \(P_i\) 表示元素不含有质因子 \(p_i\),那么,目标是 \(\displaystyle \norm{\bigcap_{i=1}^c S_i}\),又可以进行容斥:
\[\varphi(n)=\displaystyle \norm{\bigcap_{i=1}^c S_i}=\norm U-\norm{\bigcup_{i=1}^c \bar{S_i}}=n-\sum_i\frac{n}{p_i}+\sum_{i<j}\frac{n}{p_ip_j}-\cdots+(-1)^c\frac{n}{\prod_{i=1}^c p_i} \\ \Rightarrow \varphi(n)=n\prod_{i=1}^n \brak{1-\frac{1}{p_i}} \]这就是欧拉公式了。
当然,如果你足够细心,你会发现我们实际上只在质数上进行容斥,并且在容斥的过程中,取的质数次数均为一次,因此这些质数任意选出一些,他们的乘积仍然是一个__无平方因子数__,而无平方因子数的容斥系数,显然只和其含有多少个质因数有关,因此,我们可以在正整数集上,再定义一个专门针对无平方因子数的函数,它的正负号取决于无平方因子数含有的质数个数,这样,我们就得到了莫比乌斯函数:
\[\mu(n)=\begin{cases} 1&n=1 \\[2ex] (-1)^k&n=\prod_{i=1}^kp_i \\[2ex] 0&\text{otherwise} \end{cases} \]因此我们可以得到另外的一个关于 \(\varphi(n)\) 的表达式:\(\displaystyle \varphi(n)=\sum_{d\mid n}\mu(d)\frac{n}{d}\).
概率论中的容斥
对于__同一概率空间中__的事件 \(A_1,A_2,\cdots,A_n\),依然存在相似的容斥原理:
\[\text{P}\brak{\bigcup_{i=1}^nA_i}=\sum_{i}\text{P}(A_i)-\sum_{i<j}\text{P}(A_i\cap A_j)+\sum_{i<j<k}\text{P}(A_i\cap A_j\cap A_k)-\cdots+(-1)^{n-1}\text{P}\brak{\bigcap _{i=1}^n A_i} \]对于概率只和事件个数有关,那么还可以简化为:
\[\text{P}\brak{\bigcup _{i=1}^n A_i}=\sum_{i=1}^n(-1)^{i-1}{n\choose i}a_i \]一般形式的容斥原理
对于两个关于集合的函数 \(f(S),g(S)\),若
\[f(S)=\sum_{T\subset S}g(T) \]那么就有
\[g(S)=\sum_{T\subset S}(-1)^{\norm S-\norm T}f(T) \]另外一个形式:
\[f(S)=\sum_{T\supset S}g(T)\Leftrightarrow g(S)=\sum_{T\supset S}(-1)^{\norm S-\norm T}f(T) \]这个形式只需要将上面取补集即可。
这两个东西也被称为子集反演。
MinMax容斥(MinMax反演)
这个东西就是可以让 \(\min\) 和 \(\max\) 到处换过来换过去。最基本的式子:
\[\max(S)=\sum_{T\subset S}(-1)^{\norm T+1}\min(T) \\ \min(S)=\sum_{T\subset S}(-1)^{\norm T+1}\max(T) \]证明就考虑每一项是否能对上,由于两个式子长得差不过,就证上面那个。
考虑当前元素是 \(S\) 中第 \(k\) 大的,那么这个元素左边的系数就是 \([k=1]\),右边的系数,它要作为 \(T\) 中最小的,就是只在它或者比它大的元素中选,因此右边的系数是 \(\displaystyle \sum_{i=1}^{k}(-1)^{i+1}{k-1\choose i-1}=\sum_{i=0}^{k-1}(-1)^{i+2}{k-1\choose i}=\sum_{i=0}^{k-1}(-1)^{i}{k-1\choose i}=[k-1=0]=[k=1]\),得证。
它还可以推广为 \(\rm kthmax\),设 \(\text{kthmax}(S)\) 表示 \(S\) 中第 \(k\) 大的,它依然可以使用 \(\min\) 来表达,至于容斥系数,考虑使用待定系数法来解,假设当前的元素是第 \(p\) 大的,那么我们要解的是
\[\begin{aligned}{} [p=k]&=\sum_{i=1}^p\lambda(i){p-1\choose i-1} \\ &=\sum_{i=0}^{p-1}\alpha(i){p-1\choose i}&{\alpha(i)=\lambda(i+1)} \\ \end{aligned} \]将其二项式反演,可以得到
\[\alpha(p-1)=\sum_{i=0}^{p-1}(-1)^{p-1-i}{p-1\choose i}[i=k-1]=(-1)^{p-k}{p-1\choose k-1} \]因此 \(\displaystyle \lambda(i)=\alpha(i-1)=(-1)^{i-k}{i-1\choose k-1}\),所以可以得到 \(\rm kthmax\) 的式子:
\[\text{kthmax}(S)=\sum_{T\subset S,\norm T\ge k}(-1)^{\norm T-k}{\norm T-1\choose k-1}\min(T) \]当然,它也是可以用在期望上面的:
\[E(\max(S))=\sum_{T\subset S}(-1)^{\norm T+1}E(\min(T)) \]然后它就可以做题了。
先写到这里
还有的斯特林反演之类的东西......
标签:color,text,sum,容斥,笔记,反演,choose,norm 来源: https://www.cnblogs.com/Arextre/p/16075537.html