「數學」助力每一個不知死活的容斥夢

Supor__Shoop發表於2024-10-05

容斥原理

結論

假設現在有 \(n\) 個集合 \(S_i\),我們希望求得所有 \(S_i\) 的並集的大小,令集合 \(P=\{1,2,3,\dots,n-1,n\}\),那麼就有公式:

\[\begin{aligned} |\bigcup_{i=1}^nS_i| &= \sum_{i}|S_i|-\sum_{i,j}|S_i\cap S_j|+\sum_{i,j,k}|S_i\cap S_j\cap S_k|-\dots \\ &= \sum_{m=1}^n (-1)^{m-1}\sum_{T\subseteq P,|T|=m}|\bigcap_{i\in T}S_i| \end{aligned} \]

這個公式就是容斥原理的內容。

我們可以將容斥原理應用到計數問題。就好比你有 \(n\) 個限制,你要保證至少\(m\) 個限制被滿足,那麼你就可以用容斥模板對其進行思考。

舉一個簡單的例子:

P1595 信封問題(錯排問題)

某人寫了 \(n\) 封信和 \(n\) 個信封,如果所有的信都裝錯了信封。求所有信都裝錯信封共有多少種不同情況。

我們發現要求的答案就是所有的全排列 \(p\) 的數量減去至少有 \(1\)\(p_i=i\) 的方案數,前者為 \(n!\),後者我們就可以考慮容斥。

我們設計 \(n\) 個集合 \(S_i\),第 \(i\) 個集合表示欽定 \(p_i\) 必然等於 \(i\) 的排列數。則我們要求的至少有一個 \(p_i=i\) 的方案數就是 \(|\bigcup_{i=1}^nS_i|\),我們代入容斥原理的公式:

\[|\bigcup_{i=1}^nS_i|=\sum_{m=1}^n (-1)^{m-1}\sum_{T\subseteq P,|T|=m}|\bigcap_{i\in T}S_i| \]

這個式子裡要處理的交集並不好直接計算。我們發現後面的交集大小之和其實就是在 \(n\) 個集合中任選 \(m\) 個去求交集大小,即在 \(n\) 個數中任意欽定 \(m\) 個數滿足 \(p_i=i\) 的方案數,那麼它就轉換成了 \(C_{n}^m\times (n-m)!\),後面的階乘就是剩下 \(n-m\) 個數重排,不需要考慮它們是否滿足 \(p_i=i\)

那麼答案就是:

\[n!-\sum_{m=1}^n(-1)^{m-1}C_{n}^m(n-m)! \]

例題

[ARC101E] Ribbons on Tree

如果你硬做 DP 的話,你會發現無論怎麼搞都不好最佳化,根據強大的正難則反原則,我們考慮容斥,用所有可能的配對方案減去不合法的方案。

前者先不管,後者我們就可以想辦法定義若干個集合 \(S_i\) 然後與我們的容斥原理形成對接。由於題目是要我們讓每條邊都染色,那麼反過來我們就是要求至少有一條邊未被染色的方案數。套路地,設 \(S_i\) 表示欽定第 \(i\) 條邊一定不被染色的所有方案,那麼我們要求的就是所有 \(S_i\) 的並集大小了。

代入容斥的式子後,你會發現重點還是在於求任選 \(m\)\(S_i\) 的交集之和,這也是容斥原理中一向最難的點。顯然地,我們要讓 \(m\) 條邊不被染色,實際上就是在樹上刪掉這 \(m\) 條邊,然後每個連通塊中兩兩配對。

要在一個大小為 \(k\) 的連通塊裡任意配對,其實就和我們開頭說的要求的總方案數很像。我們設這個方案數為 \(f_k\),那麼就可以得到一個轉移 \(f_k=f_{k-2}\times (k-1)\),原理是你先給 \(1\) 號點選配對物件,這有 \(k-1\) 中可能,那麼剩下的 \(k-2\) 就自由發揮。但是如果 \(2 ∤ k\),那方案數就只能為 \(0\) 了。

如果我們設 \(dp_{i,j}\) 表示 \(\text{Subtree}(i)\) 中刪掉 \(j\) 條邊的方案數,我們發現無法保留“連通塊大小”這個概念,而我們求方案又必須要知道每個連通塊的確切大小。因此我們要換一個思路。

我們可以跳出容斥中列舉 \(m\) 的死思維。設 \(dp_{i,j}\) 表示在 \(\text{Subtree}(i)\) 中任意刪邊,\(i\) 所在連通塊大小為 \(j\) 時對整個答案的貢獻,只要我們在 DP 的過程中算上 \((-1)^m\) 這個係數就可以了。

具體地,我們列舉 \(i\) 的兒子 \(v\),以及 \(v\) 所在連通塊大小 \(j'\),得到轉移:

  • \((i,v)\) 這條邊不刪,則 \(dp_{i,j+j'}←dp_{i,j}\times dp_{v,j'}\)

  • \((i,v)\) 這條邊要刪,則 \(dp_{i,j}←(-1)\times dp_{i,j}\times dp_{v,j'}\times f(j')\),這裡的 \(-1\) 便是一個係數,因為此時我們多刪了一條邊,那麼根據容斥裡每一項的係數,我們現在就要多乘一個 \(-1\) 上去。

那麼我們的答案就是 \(\sum_{i=1}^n dp_{1,i}\times f_i\)。由於總方案數就是 \(dp_{1,n}\),我們就不用額外用 \(f_n\) 加上上式。

[PA2019] Trzy kule

本題不需要使用容斥公式,它只是代表了容斥這樣類似的正難則反思想。

我們的目標要讓三個條件中至少滿足一個,但是這樣的話考慮的情況會很複雜,因此我們需要轉換思想,求出三個條件都不滿足的情況。

根據觀察,我們可以發現當第 \(i\) 位對 \(s_1\) 產生了 \(1\) 的貢獻,如果 \(s_{2,i}=s_{1,i}\),則也會對 \(s_2\) 產生 \(1\) 的貢獻,\(s_3\) 同理。我們不妨設計四種狀態 \(100,101,110,111\),這四種狀態的第一位表示對 \(s_1\) 產生了 \(1\) 貢獻,後面兩位就分別表示了此時是否對 \(s_2,s_3\) 同樣造成貢獻。我們記這四種狀態的數量為 \(S_{100},S_{101},S_{110},S_{111}\),由於每一位必然有一種填法對 \(s_1\) 產生貢獻,因此有 \(S_{100}+S_{101}+S_{110}+S_{111}=n\)

為了使三個條件都不滿足,我們肯定只會分別在四種狀態中選擇若干個去對 \(s_1\) 產生貢獻,我們記 \(i,j,x,y\) 分別表示在 \(100,101,110,111\) 四種狀態中選擇了若干個去對 \(s_1\) 造成貢獻。

那麼就有:

\[\begin{cases} i+j+x+y>r_1 \\ (S_{100}-i)+(S_{101}-j)+x+y>r_2 \\ (S_{100}-i)+j+(S_{110}-x)+y>r_3 \end{cases} \]

我們考慮列舉 \(i,x\) 的值,那麼此時除了 \(j,y\) 以外的量都是定值,移項得到:

\[\begin{cases} y+j>r_1-i-x \\ y-j>r_2-S_{100}-S_{101}+i-x \\ y+j>r_3-S_{100}-S_{110}+i+x \end{cases} \]

算上 \(y+j,y-j\) 本身滿足的取值,整理一下就是:

\[\begin{cases} y+j\geq\max(r_1-i-x+1,r_3-S_{100}-S_{110}+i+x+1,0) \\ y-j\geq\max(r_2-S_{100}-S_{101}+i-x+1,-S_{101}) \end{cases} \]

我們簡記為 \(y+j\geq A,y-j\geq B\)。我們建立一個平面直角座標系,並給每個整數點 \((p,q)\) 賦權值,如果 \(\begin{cases}y+j=p \\ y-j=q \end{cases}\) 有符合題意的非負整數解,則權值為 \(C_{S_{111}}^y\times C_{S_{101}}^j\),否則為 \(0\)。那麼現在我們要做的就是詢問 \((A,B)\) 右上角的權值之和,可以使用字首和實現。記錄完這個和之後,我們就再乘上 \(C_{S_{100}}^i\times C_{S_{110}}^x\),最後加起來,就可以得到答案了。

Small Permutation Problem (Hard Version)

這是一個另類的容斥題型:就是將排列問題轉換為棋盤問題,然後在棋盤上進行容斥。

具體地,想象一個 \(n\times n\) 的棋盤,我們要在棋盤上放 \(n\) 個棋子,需要保證每一列每一行都恰好有一個棋子。在這道題當中,我們就是要滿足對於所有的 \(i\in [1,n]\),若 \(a_i\not= -1\),則 \((1,1)\to (i,i)\) 這個矩形中恰好有 \(a_i\) 個棋子。

如果沒有 \(a_i=-1\) 的情況的話,則存在合法方案數必然有 \(|a_i-a_{i-1}|\leq 2\),因為從 \((i+1,i+1)\) 轉移到 \((i,i)\) 最多隻會在第 \(i\) 列和第 \(i\) 行各放一個棋子,就是 \(2\) 個棋子。那麼我們從 \(1\)\(n\) 列舉當前的矩形 \((1,1)\to (i,i)\),維護當前每行每列可以放的棋子數量,設當前每行每列都可以放 \(c\) 個,然後進行一下分討:

  • \(a_{i-1}=a_i\),則不需要放棋子,對答案無貢獻。
  • \(a_{i-1}+1=a_i\),則我們考慮在矩形邊緣選位置,第 \(i\) 行可以放 \(c\) 個,第 \(i\) 列也可以放 \(c\) 個,除去 \((i,i)\) 重複的部分,我們就有 \(2c-1\) 種方案。在這裡因為我們放了棋子,所以我們需要讓 \(c\leftarrow c-1\)
  • \(a_{i-1}+2=a_i\),則我們顯然不能在 \((i,i)\) 處放置棋子,因為這樣的話第 \(i\) 行,第 \(i\) 列都不能放棋子了。那麼方案數就是 \((c-1)^2\),令 \(c\leftarrow c-2\)

每次擴充 \(i\rightarrow i+1\) 時,我們就讓 \(c\leftarrow c+1\)

現在我們考慮有 \(a_i=-1\) 的情況。我們可以把所有 \(a_i\not=-1\) 的下標提出來,然後只考慮這一部分的下標。設這些下標為 \(j_1,j_2,\dots,j_m\)。延用上面的思路,我們每次都需要考慮 \((j_{i-1},j_{i-1})\) 擴充到到 \((j_i,j_i)\) 這個矩形後,可以在哪些地方放棋子,透過畫圖可以我們放棋子的範圍是 \(j_i\times j_i\) 這個矩形刪掉 \(j_{i-1}\times j_{i-1}\) 這一部分後得到的 \(L\) 形。

但是我們不好處理這個問題,因此考慮容斥,先在 \(j_i\times j_i\) 的矩形中任意選擇 \(a_{j_i}-a_{j_{i-1}}\) 個可以放的位置,然後減去有若干個棋子放在 \(j_{i-1}\times j_{i-1}\) 的方案數。

\(p=j_i-a_{j_{i-1}}\)\(q=j_{i-1}-a_{j_{i-1}}\)\(t=a_{j_i}-a_{j_{i-1}}\)。則總方案數就是在 \(p\times p\)初始沒有棋子的棋盤上放 \(t\) 個棋子,即 \(C_p^{t}\times C_p^t\times t!\),含義為先確定 \(t\) 個棋子的行,再確定 \(t\) 個棋子的列,最後有 \(t!\) 種方案讓行列相互對應。

為了方便表示,設 \(f(x,y)=C_{x}^y\times C_x^y\times y!=C_x^y\times \frac{x!}{(x-y)!}\)

接下來設 \(S_i\) 表示欽定 \(i\) 個棋子放在 \(j_{i-1}\times j_{i-1}\) 矩形中的方案集合,我們需求:

\[\begin{aligned} |\bigcup_{i=1}^tS_i|&=\sum_{m=1}^t (-1)^{m-1}\sum_{T\subseteq \{1,2,\dots,t\},|T|=m}|\bigcap_{i\in T}S_i| \\ &= \sum_{m=1}^t (-1)^{m-1}f(p-m,t-m)f(q,m) \end{aligned} \]

用總方案數減去上面的式子就行了。

若要求總的答案是多少的話,我們直接對於每個容斥的結果求積就行了。

二項式反演

結論

二項式反演是容斥擴充形成的數學工具。

我們設 \(f_i\) 表示欽定 \(i\) 個元素滿足限制(但實際上滿足限制的可能不只有 \(i\) 個)的方案數,\(g_i\) 表示恰好\(i\) 個元素滿足限制的方案數,則我們可以很容易地得到一個關係式:

\[f_i=\sum_{j=i}^n g_jC_{j}^i \]

既然有 \(g\to f\) 的等式轉換,我們其實也有一個 \(f\to g\) 的等式轉換:

\[g_i=\sum_{j=i}^n(-1)^{j-i}f_j C_{j}^i \]

證明:

\[\begin{aligned}g_i&=\sum_{j=i}^n(-1)^{j-i}f_j C_{j}^i \\ &= \sum_{j=i}^n(-1)^{j-i}C_{j}^i\sum_{k=j}^n g_kC_{k}^j \\ &=\sum_{k=i}^n g_k \sum_{j=i}^k (-1)^{j-i}C_j^i C_k^j \\ &=\sum_{k=i}^ng_k\sum_{j=i}^k(-1)^{j-i}C_k^iC_{k-i}^{j-i} \\ &=\sum_{k=i}^n g_kC_k^i\sum_{j=0}^{k-i}(-1)^jC_{k-i}^j \\ &= \sum_{k=i}^n g_k C_k^i[k=i] \\ &= g_i\end{aligned} \]

因此,對於“恰好”形式的問題,我們可以設計兩個陣列 \(f_i,g_i\) 來表示欽定 \(i\) 個滿足限制和恰好 \(i\) 個滿足限制,這樣透過二項式反演就能得到正確的答案。

相關推論

整理了一下關於二項式反演的推論:

\[f_n=\sum_{i=n}^N g_iC_{i}^n\iff g_n=\sum_{i=n}^N(-1)^{i-n}f_i C_{i}^n \]

\[f_n=\sum_{i=0}^n (-1)^ig_iC_n^i\iff g_n=\sum_{i=0}^n (-1)^i f_iC_n^i \]

\[f_n=\sum_{i=n}^N (-1)^ig_iC_i^n\iff g_n=\sum_{i=n}^N (-1)^{i-n}f_iC_i^n \]

\[f_n=\sum_{i=0}^n g_iC_n^i\iff g_n=\sum_{i=0}^n (-1)^{n-i}f_iC_n^i \]

例題

Positions in Permutations

【恰好】在計數題中是一個非常棒的詞,它啟示我們用二項式反演,轉而去思考如何求【欽定】類的問題。即求出 \(f_i\) 這個欽定 \(i\) 個數滿足條件的方案數,然後根據公式反推 \(g_i\) 這個恰好有 \(i\) 個數滿足條件的方案數。

容易發現一個情景:如果要同時使得 \(i,i+2\) 都是完美數,那麼 \(i+1\) 就會成為一個特殊的量,即如果在 \(i\) 的位置填入 \(i+1\) 這個數,那麼 \(i+2\) 的位置就不能填 \(i+1\) 這個數,因為不滿足排列的性質。

結合 \(n\) 個數有 \(m\) 個滿足條件的形式,我們設計一個 DP,狀態必然包括 \((i,j)\),表示在排列的前 \(i\) 個數中有 \(j\) 個完美數。考慮到要避免一個數 \(i+1\) 同時被填入 \(i,i+2\) 這兩個位置,我們設計 \(dp_{i,j,0/1,0/1}\),表示在前 \(i\) 個數中有 \(j\) 個完美數,\(i\) 這個數是(\(1\))否(\(0\))被有效填在了當前排列中,\(i+1\) 這個數是(\(1\))否(\(0\))被有效填在了當前排列中,此時的方案數。上面的【有效】指的是被填的這個數造成了一個完美數,比如我們在 \(p_2\) 的位置放一個 \(5\),由於 \(|2-5|\not= 1\),那 \(5\) 顯然不是有效的。

為了方便轉移,我們把未欽定是否為完美數的數的階乘提出來,即 \(dp_{n,i,0/1,0}\times (n-i)!\) 才能全面地表示欽定 \(i\) 個數為完美數的方案數。

轉移的話,先考慮讓 \(i\) 成為一個完美數。

  • \(p_i=i-1\),則需保證 \(i-1\) 這個數沒有被填過。而此時 \(i+1\) 顯然沒有被填過,\(i\) 填不填不會影響 \(p_i\) 是完美數,因此 \(dp_{i,j,0,0}\leftarrow dp_{i-1,j-1,0,0}\)\(dp_{i,j,1,0}\leftarrow dp_{i-1,j-1,0,1}\)
  • \(p_i=i+1\),則 \(i,i-1\) 這兩個數是否被填不會產生影響,因此 \(dp_{i,j,0,1}\leftarrow dp_{i-1,j-1,0,0}+dp_{i-1,j-1,1,0}\)\(dp_{i,j,1,1}\leftarrow dp_{i-1,j-1,0,1}+dp_{i-1,j-1,1,1}\)

再考慮 \(i\) 不是完美數,則有:\(dp_{i,j,x,0}\leftarrow dp_{i-1,j,0,x}+dp_{i-1,j,1,x}\),其中 \(x\in\{0,1\}\)

\(f_i\) 表示欽定 \(i\) 個數為完美數的方案數,\(g_i\) 表示恰好 \(i\) 個數為完美數的方案數,則有 \(f_i=(dp_{n,i,0,0}+dp_{n,i,1,0})\times (n-i)!\)。接著根據反演公式得到:

\[g_m=\sum_{i=m}^n (-1)^{i-m}f_iC_i^m \]

預處理組合數和階乘即可。

已經沒有什麼好害怕的了

對於差值的【恰好】貌似不太好處理,我們將題意轉換一下,設糖果能量大於藥片的配對數量為 \(x\),則需滿足 \(x-(n-x)=k\Rightarrow x=\dfrac{n+k}{2}\),我們要求的就是恰好有 \(x\) 對糖果能量大於藥片的方案數。

【恰好】轉換為【欽定】。我們設 \(f_i\) 表示欽定有 \(x\) 對滿足條件的方案數。考慮 DP,先將糖果和藥片按照能量大小排序,設 \(dp_{i,j}\) 表示處理前 \(i\) 個糖果,已經有 \(j\) 對滿足條件的方案數,不考慮內部不滿足條件的隨機組合,即不滿足條件的配對是最後才考慮上去的。

  • 如果讓第 \(i\) 個糖果去配對一個比它大的藥片,那麼就不會產生貢獻,\(dp_{i,j}\leftarrow dp_{i-1,j}\)

  • 如果讓第 \(i\) 個糖果去配對一個比它小的藥片,那麼就會產生貢獻。考慮會有多少個比它小的藥片,由於原陣列已經排序,我們可以求出所有藥片中比它小的數量為 \(v\),由於我們已經將糖果排了序,前面有 \(j-1\) 個糖果已經配到了 \(j-1\) 個更小的藥片,那麼 \(i\) 就只剩下了 \(v-j+1\) 個可能的配對物件,因此 \(dp_{i,j}\leftarrow dp_{i-1,j-1}\times (v-j+1)\)

注意到我們的 DP 不考慮內部不滿足條件的隨機組合,因此上面的第二種轉移不需要考慮 \([1,i-1]\) 中除了 \(j-1\) 個糖果以外的會佔到 \([1,v]\) 的糖果。那麼 \(f_i=dp_{n,i}(n-i)!\)。根據反演公式:

\[g_x=\sum_{i=x}^n (-1)^{i-x}f_iC_i^x \]

輸出 \(g_x\) 就行了。

Timber

先思考如何判斷一個合法的初始局面,我們可以貪心一下,從前往後列舉每一棵樹,如果這棵樹可以向左倒就向左倒,如果不行就向右倒,這樣下去如果存在一個點被多次覆蓋,那麼這個初始局面就是不合法的。

因此我們可以設計一個 \(dp_{i,j}\) 表示在貪心策略下,當前確定了左邊的前 \(i\) 棵樹,最後一個被覆蓋的位置為 \(j\) 的合法初始局面數量,這裡的 \(j\) 也相當於 \(i\) 倒下後形成的區間的右端點。

考慮從 \((i-1,l)\) 轉移到 \((i,j)\),由於 \((i,j)\) 狀態中 \(i\) 倒下後的區間必然為 \([j-k,j]\),為了滿足不相交的條件,我們必然有 \(l<j-k\)。接下來討論第 \(i\) 棵樹的位置是在 \(j\) 還是在 \(j-k\)

  • 若第 \(i\) 棵樹的位置為 \(j\),則它是向左倒的,只需要滿足 \(l<j-k\) 即可,因此 \(dp_{i,j}\leftarrow \sum _{l=k+1}^{j-k-1}dp_{i-1,l}\)

  • 若第 \(i\) 棵樹的位置為 \(j-k\),則它是向右倒的,根據貪心策略,此時 \(i\) 一定不能向左倒,那麼就有 \((j-k)-k\leq l<j-k\),即 \(l\in [j-2k,j-k)\),因此 \(dp_{i,j}\leftarrow \sum_{l=j-2k}^{j-k-1}dp_{i-1,l}\)

考慮轉換一下思路,這個 DP 的本質就是在處理前 \(i\) 個互不相交的區間,然後根據貪心策略來計算,如果第 \(i\) 個區間與第 \(i-1\) 個區間之中隔了數量 \(<k\) 的空位,那麼第 \(i\) 個區間就可以是左端點向右倒,右端點向左倒兩種覆蓋方式;否則就只能是右端點向左倒。

因此我們設 \(f_i\) 表示欽定有 \(i\) 個區間只有 \(1\) 種覆蓋方式的方案數,\(g_i\) 表示恰好有 \(i\) 個區間的方案數。則最終答案顯然為 \(\begin{aligned} \sum_{i=0}^m 2^{m-i}g_i\end{aligned}\)

根據反演公式,我們只需要求出 \(f_i\) 即可。如何求 \(f_i\)?我們先減去 \(mk\) 表示 \(m\) 個區間除了左端點的其餘 \(k\) 個位置,那麼我們就能在 \(n-mk\) 個位置中選擇 \(m\) 個位置表示 \(m\) 個左端點,那是因為要滿足 \(i\) 個區間與前面的距離 \(\geq k\),因此我們還要額外刪掉 \(ik\) 個位置,最後在 \(m\) 個區間中選擇 \(i\) 個並在它們的前面各自插入 \(k\) 個位置,這樣得到的初始局面就一定是合法的,方案數為 \(C_{n-mk-ik}^m\times C_{m}^i\)

則總答案為:

\[\begin{aligned} \sum_{i=0}^m 2^{m-i}g_i &= \sum_{i=0}^m 2^{m-i}\sum_{j=i}^m (-1)^{j-i}f_jC_j^i \\ &= \sum_{j=0}^m f_j\sum_{i=0}^j 2^{m-i}(-1)^{j-i}C_j^i \\ &= \sum_{j=0}^mf_j2^{m-j}\sum_{i=0}^j 2^{j-i}\dfrac{(-1)^j}{(-1)^i}C_j^i \\ &= \sum_{j=0}^m f_j2^{m-j}(-1)^j\sum_{i=0}^j2^{j-i}(-1)^iC_j^i \\ &= \sum_{j=0}^mf_j2^{m-j}(-1)^j(-1+2)^j \\ &= \sum_{j=0}^m f_j2^{m-j}(-1)^j \end{aligned} \]

其中第四行到第五行的轉換是二項式定理。最後的式子我們就可以直接 \(O(m)\) 求了。

莫比烏斯反演

莫比烏斯函式

我們定義一個定義域為正整數的函式 \(\mu(x)\) 滿足以下條件:將 \(x\) 分解為 \(\begin{aligned}\prod_{i=1}^n p_i^{c_i}\end{aligned}\),其中 \(p_i\) 為質數且互不相同,\(c_i\geq 1\),若 \(x=1\)\(\mu(x)=1\),若 \(\exist c_i,c_i>1\)\(\mu(x)=0\),若 \(\forall c_i,c_i=1\)\(\mu(x)=(-1)^n\)。我們稱這個函式為莫比烏斯函式。

莫比烏斯函式是一個積性函式。

莫比烏斯函式也滿足下面這個性質:

\[\sum_{d\mid n}\mu(d)=\begin{cases}1 & n=1 \\ 0 & n>1\end{cases} \]

結論

莫比烏斯反演具有兩種不同的形式:

\[f_n=\sum_{d\mid n} g_d\iff g_n=\sum_{d\mid n}\mu(d)f_{\frac{n}{d}} \]

\[f_n=\sum_{n\mid d}g(d)\iff g_n=\sum_{n\mid d}\mu(\frac{d}{n})f_d \]

例題

YY的GCD

莫比烏斯函式的入門題。

題目要求 \(\gcd(x,y)\) 為質數,那麼我們就可以直接列舉這個質數 \(p\),然後看有多少對 \((x,y)\) 滿足 \(\gcd(x,y)=p\)。接著我們就要開始進行一些的推算:

\[\begin{aligned} & \sum_{p\in \text{Prime}}\sum_{p\mid x}\sum_{p\mid y}[\gcd(x,y)=p] \\ =& \sum_{p\in \text{Prime}}\sum_{x=1}^{\lfloor \frac{n}{p}\rfloor}\sum_{y=1}^{\lfloor \frac{m}{p}\rfloor} [\gcd(x,y)=1] \end{aligned} \]

根據莫比烏斯函式的性質: \(\sum_{d\mid n}\mu(d)=[n=1]\),我們可以換成:

\[\begin{aligned} & \sum_{p\in \text{Prime}}\sum_{x=1}^{\lfloor \frac{n}{p}\rfloor}\sum_{y=1}^{\lfloor \frac{m}{p}\rfloor} [\gcd(x,y)=1] \\ = &\sum_{p\in \text{Prime}}\sum_{x=1}^{\lfloor \frac{n}{p}\rfloor}\sum_{y=1}^{\lfloor \frac{m}{p}\rfloor} \sum_{d\mid \gcd(x,y)}\mu(d) \\ = &\sum_{p\in \text{Prime}}\sum_{d}\mu(d)\sum_{d\mid x}\sum_{d\mid y} 1 \\ = &\sum_{p\in \text{Prime}}\sum_{d}\mu(d)\times \lfloor \dfrac{n}{pd}\rfloor\times \lfloor \dfrac{m}{pd}\rfloor \end{aligned} \]

考慮列舉 \(pd\) 的值為 \(t\) 以及質數 \(p\),則原式變為:

\[\sum_{t=1}^{\min(n,m)} \lfloor \dfrac{n}{t}\rfloor\times \lfloor \dfrac{m}{t}\rfloor\sum_{p\in \text{Prime}}\mu(\dfrac{t}{p}) \]

後面那個求和顯然可以預處理,我們列舉每一個質數 \(p\),然後依次找它的不超過 \(\min(n,m)\) 的倍數去算貢獻。

最後,由於存在 \(10^4\) 組輸入,我們可以用整除分塊去最佳化上式,把 \(\begin{aligned}\sum_{p\in \text{Prime}}\mu(\dfrac{t}{p})\end{aligned}\) 最佳化成字首和的形式就行了。

Winter is here

設值域上界 \(m=10^6\)

遇事不決推式子:

\[\begin{aligned} & \sum_{d=2}^m\sum_{k=1}^nkd\sum_{T\in \{1,\dots,n\},|T|=k} [\gcd_{x\in T}x=d] \\ = & \sum_{d=2}^m\sum_{k=1}^nkd \sum_{d\mid b_1}\sum_{d\mid b_2}\dots \sum_{d\mid b_k} [\gcd_{i=1}^k \dfrac{b_i}{d}=1] \\ = & \sum_{d=2}^m\sum_{k=1}^nkd \sum_{d\mid b_1}\sum_{d\mid b_2}\dots \sum_{d\mid b_k}\sum_{x\mid \gcd\{\frac{b_1}{d},\dots,\frac{b_k}{d}\}} \mu(x) \\ = & \sum_{d=2}^m\sum_{k=1}^nkd\sum_{x}\mu(x) \sum_{xd\mid b_1}\sum_{xd\mid b_2}\dots \sum_{xd\mid b_k} 1 \\ = & \sum_{d=2}^md\sum_{x}\mu(x)\sum_{k=1}^nk\sum_{xd\mid b_1}\sum_{xd\mid b_2}\dots \sum_{xd\mid b_k} 1 \end{aligned} \]

我們設 \(cnt(i)\) 表示 \(\sum_{j=1}^n [i\mid a_j]\),則原式可轉換為:

\[\begin{aligned} \sum_{d=2}^md\sum_{x}\mu(x)\sum_{k=1}^{cnt(xd)} k\times C_{cnt(xd)}^k \end{aligned} \]

我們可以對每一個 \(i\) 預處理一個 \(f_i\) 表示 \(\begin{aligned}\sum_{k=1}^{cnt(i)}k\times C_{cnt(i)}^k\end{aligned}\),則答案為:

\[\begin{aligned} \sum_{d=2}^md\sum_{x}\mu(x)f_{xd} \end{aligned} \]

我們發現列舉的 \(d,x\) 要滿足 \(xd\leq m\),因此時間複雜度為 \(O(m\log m)\),預處理時間複雜度為 \(O(n\sqrt{m})\)

Relatively Prime Powers

考慮一個性質:若一個數 \(x\) 是不合法的,那麼 \(x\) 必然能被表示為 \(a^b(a\geq 1,b\geq 2,a,b\in \mathbb{Z})\) 的形式,且 \(b\)\(x\) 分解後各個質因數的指數的最大公約數的因數,證明的話根據題意來看還是比較顯然的。

我們設 \(f_i\) 表示分解後各個質因數的指數最大公約數為 \(i\) 的倍數的 \(x\) 個數,\(g_i\) 則表示最大公約數恰好為 \(i\)\(x\) 個數。則有:

\[f_i=\sum_{i\mid d}g_d\Longrightarrow g_i=\sum_{i\mid d}\mu(\dfrac{d}{i})f_d \]

我們要求的答案即為 \(g_1\)。問題轉換為求 \(f_i\)

根據性質,若一個數 \(x\) 的質因數指數的最大公約數為 \(i\) 的倍數,那麼一定有 \(\sqrt[i]{x}\in \mathbb{N}\),由於 \(x\not= 1\),我們的 \(f_i\) 就可以表示為 \(\lfloor \sqrt[i]{n}\rfloor-1\)。因此最終的答案為:

\[g_1=\sum_{d=1}^{\log_2^n}\mu(d)(\lfloor \sqrt[d]{n}\rfloor-1) \]

不過 CF 好像會卡 pow 的精度,我們就先用 pow 來求一次 \(x=\sqrt[i]{n}\),然後判斷當前這個答案的周圍兩個數 \(x-1,x+1\) 是否滿足 \((x-1)^i\leq n,(x+1)^i\leq n\),調整一下 \(x\) 的值即可。

Min-Max 容斥

結論

有一個全集 \(U=\{a_1,a_2,\dots,a_n\}\),對於一個集合 \(S\),有以下兩個關於最大值和最小值的等式:

\[\min_{a_i\in S}\{a_i\}=\sum_{T\subseteq S,T\not= \varnothing} (-1)^{|T|+1}\max_{a_i\in T}\{a_i\} \]

\[\max_{a_i\in S}\{a_i\}=\sum_{T\subseteq S,T\not= \varnothing} (-1)^{|T|+1}\min_{a_i\in T}\{a_i\} \]

對於第一個等式的證明:

不妨設 \(U\) 中的元素互不相同,若 \(U\) 中存在相同元素則以編號為序。接著,我們讓 \(U\) 中元素從小到大排序,設排序後第 \(i\) 個數為 \(b_i\)

對於一個 \(S\) 的子集 \(T\),令 \(T\) 中的最大值為 \(b_k\)

  • \(k=1\),則 \(T=\{b_1\}\),有 \((-1)^{|T|+1}b_1=b_1\)
  • \(k>1\),則 \(T\in \{b_1,b_2,\dots,b_k\}\),我們在 \(T\) 中欽定 \(b_k\) 這個值必然存在,剩餘的 \(k-1\) 個數可選可不選,因此可能的 \(T\) 的數量有 \(2^{k-1}\) 個。由於 \(k>1\),則 \(|T|\) 為奇數和偶數的機率相等,兩種答案便會因為 \((-1)^{|T|+1}\) 的差異被完全抵消。

綜上,第一個等式成立。

對於第二個等式的證明同理。

但是光是這個等式是沒有什麼大用的。我們還存在另一種結論:這兩個等式在期望最大值最小值的情況下同樣成立,即:

\[E(\min_{a_i\in S}\{a_i\})=\sum_{T\subseteq S,T\not= \varnothing} (-1)^{|T|+1}E(\max_{a_i\in T}\{a_i\}) \]

\[E(\max_{a_i\in S}\{a_i\})=\sum_{T\subseteq S,T\not= \varnothing} (-1)^{|T|+1}E(\min_{a_i\in T}\{a_i\}) \]

擴充套件 Min-Max 容斥

定義 \(\text{Kthmax}(S)\)\(S\) 中的第 \(k\) 大元素,\(\text{Kthmin}(S)\)\(S\) 中的第 \(k\) 大元素,則我們還有:

\[\text{Kthmax}(S)=\sum_{T\subseteq S,T\not= \varnothing} (-1)^{|T|-k}C_{|T|-1}^{k-1}\min_{a_i\in T}\{a_i\} \]

\[\text{Kthmin}(S)=\sum_{T\subseteq S,T\not= \varnothing} (-1)^{|T|-k}C_{|T|-1}^{k-1}\max_{a_i\in T}\{a_i\} \]

\[E(\text{Kthmax}(S))=\sum_{T\subseteq S,T\not= \varnothing} (-1)^{|T|-k}C_{|T|-1}^{k-1}E(\min_{a_i\in T}\{a_i\}) \]

\[E(\text{Kthmin}(S))=\sum_{T\subseteq S,T\not= \varnothing} (-1)^{|T|-k}C_{|T|-1}^{k-1}E(\max_{a_i\in T}\{a_i\}) \]

對於第一個等式的證明:

由於 \(k\) 值給定,我們設一個集合 \(T\) 對應的貢獻式子的係數為 \(f(|T|)\),即:

\[\text{Kthmax}(S)=\sum_{T\subseteq S,T\not= \varnothing} f(|T|)\min_{a_i\in T}\{a_i\} \]

我們讓全集 \(U\) 中元素從大到小排序,設排序後第 \(i\) 個數為 \(b_i\)。設 \(T\) 中最小值為 \(b_t\),列舉 \(b_1,b_2,\dots,b_{t-1}\) 中被選入 \(T\) 中的數為 \(i\),則 \(b_t\) 的貢獻次數為 \(\begin{aligned}\sum_{i=1}^{t-1}C_{t-1}^i f(i+1)\end{aligned}\)。為了使得最終的答案為 \(\text{Kthmax}(S)\),我們需要使得:

\[\sum_{i=1}^{t-1}C_{t-1}^i f(i+1)=[t=k]\iff \sum_{i=1}^tC_t^if(i+1)=[t=k-1] \]

\(g(t)=[t=k-1]\),則上式構成二項式反演結構,已知 \(f\to g\) 的關係式,則能夠得到 \(g\to f\) 的關係式:

\[\begin{aligned} & f(t+1)=\sum_{i=1}^t (-1)^{t-i}g_iC_t^i=(-1)^{t-k+1}C_t^{k-1} \\ \Longrightarrow & f(t)=(-1)^{t-k}C_{t-1}^{k-1}\end{aligned} \]

因此原式成立。

其餘證明同理。

例題

Card Collector

翻譯一下題意:有 \(n\) 張卡片,每包零食中含有這些卡片的機率分別為 \(p_1,p_2,p_3,\dots,p_n\),每包至多一張卡片,可能沒有卡片,問期望要買多少包零食才能拿到所有的 \(n\) 張卡片。

注意這裡的 \(p_i\) 針對的是同一包零食,形象地說,我們可以想象一個圓,其中 \(100p_i\%\) 的部分是第 \(i\) 張卡片,剩餘的 \(100(1-\sum p_i)\%\) 的部分就是一張卡片都沒有。

我們可以分開考慮,設 \(x_i\) 表示抽到第 \(i\) 張卡片的期望次數,那麼問題就是求 \(E(\max\{x_1,x_2,\dots,x_n\})\)。接著,我們使用 Min-Max 容斥的公式:

\[E(\max\{x_1,x_2,\dots,x_n\})=\sum_{S\subseteq \{x_1,\dots,x_n\},S\not=\varnothing}(-1)^{|S|+1}E(\min_{x_i\in S}\{x_i\}) \]

因此我們的問題最後轉換為,對任意一個集合 \(S\)\(\min\{x_i\}\) 的期望。說人話,就是在我們的圓上隨機放點,看期望放多少個點才能讓 \(S\) 對應的區域中存在點,這個機率顯然為 \(\sum_{x_i\in S}x_i\),那麼期望次數就取一個倒數,變成 \(\begin{aligned}\dfrac{1}{\sum_{x_i\in S}x_i}\end{aligned}\)

最後對每個集合求和即可。

[HAOI2015] 按位或

\(x_i\) 表示二進位制上第 \(i\) 位變為 \(1\) 的期望次數,則答案為 \(E(\max\{x_1,x_2,\dots,x_n\})\),根據 Min-Max 容斥公式可以得到:

\[E(\max\{x_1,x_2,\dots,x_n\})=\sum_{S\subseteq \{x_1,\dots,x_n\},S\not= \varnothing} (-1)^{|S|+1}E(\min_{x_i\in S}\{x_i\}) \]

那麼問題就轉換為:對於每個集合 \(S\),計算期望多少次才能使得 \(S\) 中存在一位變成 \(1\)。再將期望轉換為求機率,透過簡單容斥得到機率為 \(1-\sum_{S\cap T}p_T\),但是我們無法透過 \(O(3^n)\) 的列舉子集去計運算元集和。

這個時候我們就可以用到 FMT 快速莫比烏斯變換了,FMT 可以快速求出每個集合的子集和。

考慮到小數運算的誤差,我們判斷大小關係的時候最好加上一個 eps

參考部落格

【2】容斥與二項式反演——By Larunatrecy

【學習】容斥原理與莫比烏斯反演——By yhf_2015

相關文章