1. 程式人生 > 其它 >[學習筆記]容斥?反演?

[學習筆記]容斥?反演?

\[\color{red}{\textsf{小遊者,真神人也,左馬桶,右永神,會執利筆破邪炁,何人當之?}} \\ \begin{array}{|} \hline \color{pink}{\text{A small swimmer is a God.}} \\ \color{pink}{\text{The left toilet and the right eternal God}} \\ \color{pink}{\text{can break the evil energy with a sharp pen.}} \\ \color{pink}{\text{Who can resist him? }} \\ \hline \end{array} \\ \begin{array}{|} \hline \color{green}{\text{小遊者は、神であり、左便器、右永神であり}} \\ \color{green}{\text{鋭いペンを持って真実を突き刺している。誰が彼に抵抗できるだろうか? }} \\ \hline \end{array} \\ \begin{array}{|} \hline \color{lightblue}{\text{Petit voyageur, est Dieu aussi, toilettes gauche, Dieu éternel droit,}} \\ \color{lightblue}{\text{peut tenir un stylo tranchant pour briser le mal, qui devrait le faire?}} \\ \hline \end{array} \\ \begin{array}{|} \hline \color{purple}{\text{Der Direktor ist wirklich ein Gott}} \\ \color{purple}{\text{mit einer Toilette links und Yongshen rechts}} \\ \color{purple}{\text{der einen spitzen Stift hält}} \\ \color{purple}{\text{um die Wahrheit zu durchdringen.}} \\ \color{purple}{\text{Wer kann ihm widerstehen? }} \\ \hline \end{array} \\ \begin{array}{|} \hline \color{cyan}{\text{Ein kleiner Schwimmer ist ein Gott.}} \\ \color{cyan}{\text{Die linke Toilette und der rechte ewige Gott können }} \\ \color{cyan}{\text{die böse Energie mit einem scharfen Stift brechen.}} \\ \color{cyan}{\text{Wer sollte es sein?}} \\ \hline \end{array} \\ \color{red}{\textsf{對曰:“無人,狗欲當之,還請賜教!”}} \\ \newcommand\brak[1]{\left({#1}\right)} \newcommand\Brak[1]{\left\{{#1}\right\}} \newcommand\d[0]{\text{d}} \newcommand\string[2]{\genfrac{\{}{\}}{0pt}{}{#1}{#2}} \newcommand\down[2]{{#1}^{\underline{#2}}} \newcommand\ddiv[2]{\left\lfloor\frac{#1}{#2}\right\rfloor} \newcommand\udiv[2]{\left\lceil\frac{#1}{#2}\right\rceil} \newcommand\lcm[0]{\operatorname{lcm}} \newcommand\set[1]{\left\{{#1}\right\}} \newcommand\ceil[1]{\left\lceil{#1}\right\rceil} \newcommand\floor[1]{\left\lfloor{#1}\right\rfloor} \newcommand\rhs[1]{\;\text{Rhs}\;#1} \newcommand\lhs[1]{\;\text{Lhs}\;#1} \newcommand\Vec[1]{\vec{\mathbf{#1}}} \newcommand\rank[0]{\text{rank}} \newcommand\group[1]{\left\langle\right\rangle} \newcommand\norm[1]{\left|{#1}\right|} \]

  部分內容也是 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)) \]

  然後它就可以做題了。

先寫到這裡

  還有的斯特林反演之類的東西......




  1. 作者:王迪(成都七中) ↩︎

  2. 作者:\(\sf VFleaKing\)↩︎