眾所周知,容斥原理是計數問題中最雞賊的東西.基本上很多計數問題都要用到容斥,但是有的時候你明明知道要容斥就是不知道怎麼容斥.所以特此寫在這裡總結一下.
一般來說,這種容斥原理一般有n個性質,滿足第\(i\)個性質的元素集合為\(a_i\),還有乙個全集\(u\)。
現在我們需要統計\(ans=|u \bigcap \overline a_1 \bigcap \overline a_2 \cdots \bigcap \overline a_n |\)
有\(ans=\sum_ (-1)^|u \bigcap s_ 1 \bigcap s_ 2 \cdots \bigcap s_ |\)
如果用組合意義來說的話,\(x \in a_i\)是代表元素\(x\)具有性質\(i\),我們要求的就是不具有所有性質的元素個數。
這個這個定理的證明如下。
我們用集合\(g_s\)來表示滿足集合\(s\)中的所有性質,並且不滿足集合\(\overline s\)中的所有性質的元素集合,即\(g _ s=\\)
那麼我們要求的就是\(g_\)。
\(ans=\sum_ (-1)^|u \bigcap s_ 1 \bigcap s_ 2 \cdots \bigcap s_ |\)
不難得知
\[\sum_ (-1)^ =
\begin
1\quad (t = \varnothing)\\
0\quad (otherwise)
\end\]
證明:\(ans=\sum_ (-1)^|u \bigcap s_ 1 \bigcap s_ 2 \cdots \bigcap s_ |\sum_ \sum_ (-1)^=g_\)
本質上還是容斥的變形。
min-max容斥的核心式子有兩個。
1.\(\min\,c\}=\max\,\min\\}\)
2.\(\max\=a+b-\min\\)
正確性顯然。
基於第乙個結論,我們猜測$$ans=\max_^n=\sum_ (-1)^\min $$
顯然可以歸納證明。
\[ans=\max_^n\=\max_^\ + a_n -\min\^\ ,a_n\}
\\=\max_^\ + a_n -\max_^\\}
\\=\sum_ (-1)^\min\ + (-1)^\min\+a_n
\\=\sum_(-1)^\min \\]
upd:上面寫的證明太複雜了,其實只需要按照元素大小排序,那麼可以化歸到已知的簡單容斥裡去了。
假設我們有長度為\(n+1\)的數列\(\\)分別代表具有性質\(a_i\)的集合元素的個數。
通常,我們需要計算的是\(s(a_i)\),即性質\(a_i\)對答案造成的貢獻。
但是某些情況下\(s(a_i)\)太難計算,我們引入長度為\(n+1\)的數列\(\\),代表具有性質\(b_j\)的集合元素個數。
假如我們可以知道關係式\(s(b_j)=\sum_^nf_s(a_i)\)。
那麼我們可以構造乙個關係\(s(a_i)=\sum_^n g_s(b_j)\)
如果我們將第乙個代入第二個會發生什麼呢?
$$s(a_i)=\sum_^n g_ \sum_^n f_ s(a_l)
\=\sum_^n s(a_l) \sum_^n g_f_$$
假如我們設\(h_=\sum_^n g_f_\),有\(s(a_i)=\sum_^n h_s(a_j)\)
顯然可以知道
$$h_=\begin
1 \quad i=j\
0 \quad i\neq j
\end$$
那麼如果我們把\(f,g,h\)都當作矩陣的話,那麼\(h\)就是單位矩陣\(e\),而且\(fg=e\)
那麼\(g=f^\)
這樣我們就得到了容斥係數矩陣\(g\),按照最暴力的方法求是\(o(n^3)\)的。
再直接帶入容斥係數就可以\(o(n^2)\)算出\(\sum_^n s(a_i)\)的值了。
等等!為什麼我碰到的容斥題都是\(n=10^5,n=2000\),從來就沒有見過可以\(o(n^3)\)做的容斥題啊。
很多時候\(b_i\)都是由我們自己構造,既然自己構造的話就可以雞賊一點,比如說我們構造\(\\),令其對\(\\)的轉移矩陣\(f\)是乙個下三角矩陣。
這樣的話就相當於\(s(b_i)=\sum_^i s(a_j) f_\),我們可以依次解出\(\\)的值。
或者對這個下三角矩陣求逆,利用矩陣\(g\)和\(\\)直接求出\(\\)。
那這樣我會\(o(n^2)\)的了,可是那些\(o(n)\)的題是怎麼做的啊。
有些時候,題目只要求求某個性質的值,比如\(s(a_n)\),按照常規做法,你就不得不遞推出其他所有的容斥矩陣。
但是如果我們一開始就知道了這些性質的容斥矩陣,豈不是就可以直接用對應的\(\\)轉移給\(a_0\)。所以,某些時候,我們可以自己手算或者打表找出轉移矩陣的容斥係數。
不過如果用矩陣來表示的容斥有時候比較繁瑣,於是便有了係數的形式。
假如我們要算\(ans=\sum_^n p_i s(a_i)\)。
可以構造容斥係數\(q_j\),令\(ans=\sum_^n q_j s(b_j)\)
有$$ans=\sum_^n q_j\sum_^n f_ s(a_i)
\=\sum_^n s(a_i)\sum_^n q_j f_ =\sum_^n p_i s(a_i)$$
有等式$$p_i=\sum_^n f_ q_j$$
如果\(f\)是上三角或者下三角矩陣,我們求出\(q_j\)就只需要\(o(n^2)\)的時間。
特別的,如果\(f_\)可以被表示成兩個函式如\(h(j)\)與\(h(i-j)\)的積,那麼上式還是乙個卷積的形式,可以多項式求逆在\(o(nlogn)\)的時間內求出容斥係數。
大多數情況下,容斥係數都是有跡可尋的,可以猜想一些可靠的容斥係數然後自己手推式子或者打表證明一下,當然複雜度允許的話也可以遞推或者對矩陣求逆。
在特殊情況下,還有一些經典的容斥係數。
1.組合數形式的容斥(二項式反演):
\[q_n=\sum_^n \binom p_i \leftrightarrow p_n=\sum_^n (-1)^ \binom q_i
\]2.倍數關係的容斥(莫比烏斯反演)。
\[q_n=\sum_ p_d \leftrightarrow p_n=\sum_ \mu( ) q_d
\]\[q_n=\sum_ p_d \leftrightarrow p_n=\sum_ \mu( ) q_d
\]3.斯特林數形式的容斥(斯特林反演)。
\[q_n=\sum_^\beginn \\ i\endp_i \leftrightarrow p_n=\sum_^(-1)^\beginn \\ i\endq_i
\]upd:對於三個反演的證明。
1.二項式反演
由二項式定理可知,
\[(x+1)^n=\sum_^n \binom x^i \quad[1]\\
x^n=\sum_^n (-1)^\binom (x+1)^i \quad[2]\]
將\([2]\)帶入\([1]\)得到等式\([n=i]=\sum_^n (-1)^\binom \binom \)
將反演式子互相帶入可以得到等價與該等式。
2.莫比烏斯反演(只證第乙個)
莫比烏斯函式滿足性質,\([n=1]=\sum_ \mu(d)\)。
即滿足與衡等函式\(i\)的狄利克雷卷積為單位函式\(e\),\((\mu * i)(n)=e(n)=[n=1]\)
當然這是狄利克雷卷積,如果是矩陣的話,那麼就是矩陣
\(\mu_=[j|i]mu() ,i_=[j|i]\)相乘,顯然這是滿足\(\mu i=e\)的。
第二個的證明就是把整除符號的兩邊反過來,本質上沒有什麼區別。
3.斯特林反演
可以去看我的另外一篇博文第二類斯特林數總結
容斥原理 數論
兩個集合的容斥關係公式 a b a b a b a b 重合的部分 三個集合的容斥關係公式 a b c a b c a b b c c a a b c 最後可以推廣到n個集合,集合裡的元素為奇數則加,偶數減 hdu 4135 很簡單,直接求出所有的質因子,然後容斥解決 author crystal ...
容斥原理,反演
大概知道為什麼自己水平比較渣啦。一開始只會反演,然後被容斥驚豔到。然後寫了一段時間容斥,反演忘光光。所以融會貫通真的很難。多校的三道題,當時是用反演做的。事實上以前就知道容斥跟莫比烏斯函式值的關係,然後熟練掌握 然後一段時間沒用就忘了哈。簡單來說就是,求乙個數和乙個集合中的數互質的個數,把集合中乙個...
關於容斥原理
容斥原理大概是這樣的,以長方體體積並為例,我們需要用容斥原理容斥出若干個長方體體積的並.首先,我們將每個長方體標號為1 n,那麼這些長方體的取捨顯然可以表示為乙個二進位制的數字s.設f s 表示長方體取捨狀態為s時,長方體的體積並,於是我們可以知道f 111111 有n個1 就是我們最終的所求.好,...