容斥原理学习笔记
公式
并集
$$left|igcup_{i=1}^nS_iight|=sum_i|S_i|-sum_{i<j}|S_icap S_j|+sum_{i<j<k}|S_icap S_jcap S_k|-cdots+(-1)^{n-1}|S_1cap cdotscap S_n|$$
證明
對于元素$x$,假設它屬于的集合為$T_1,T_2,ldots,T_m$,那么它對答案的貢獻為:
$$|{T_i}|-|{T_icap T_j|i<j}|+|{T_icap T_jcap T_k|i<j<k}|-cdots+(-1)^{m-1}|{T_1cap T_2cap cdotscap T_m}|\=inom{m}{1}-inom{m}{2}+cdots+(-1)^{m-1}inom{m}{m}=1$$
于是每個元素都只被計算了一次,總和即為并集的大小
交集
$$left|igcap_{i=1}^nS_iight|=|U|-left|igcup_{i=1}^noverline{S_i}ight|$$
其中$U$為全集,$overline{S}$為$S$對$U$的補集
計算時可對右邊補集的并進行容斥
證明
若$xinigcupoverline{S_i}$,則$exists i,x
otin S_i$,即$x$不存在與交集中,貢獻為0,反之貢獻為1
于是最后總和為交集的大小
例題
錯排問題
求出滿足以下條件的長度為$n$的排列$p$的個數:$forall i,p_i
eq i$
解法
考慮容斥:
設$S_i$表示滿足$p_i
eq i$的排列$p$的集合,那么題目要求的是$|igcap S_i|$
根據公式:
$$Ans=left|igcap_{i=1}^nS_iight|=|U|-left|igcup_{i=1}^noverline{S_i}ight|\=|U|-sum_i|overline{S_i}|+sum_{i<j}|overline{S_i}capoverline{S_j}|-cdots-(-1)^{n-1}|overline{S_1}cap cdotscapoverline{S_n}|$$
注意到:
$$forall a_1<a_2<cdots<a_m,left|igcap_{i=1}^moverline{S_{a_i}}ight|=(n-m)!$$
于是:
$$Ans=sum_{m=0}^n(-1)^msum_{a_i<a_2<cdots<a_m}left|igcap_{i=1}^moverline{S_{a_i}}ight|=sum_{i=0}^n(-1)^iinom{n}{i}(n-i)!=n!sum_{i=0}^nfrac{(-1)^i}{i!}$$
那么就可以愉快的$O(n)$求了
方格染色問題:
有一個n行m列的方格,初始均為白色,可以選擇一些格子染黑,問滿足每行每列至少有一個黑格子的方案數
解法
和上題思路差不多,先求出至少有$i$行$j$列沒有黑格子的方案數,為$2^{(n-i)(m-j)}$
根據容斥原理:
$$Ans=sum_{i=0}^nsum_{i=0}^m(-1)^{(i+j)}inom{n}{i}inom{m}{j}2^{(n-i)(m-j)}$$
效率$O(n^2)$
其它題目
[HAOI2008]硬幣購物
[THUPC2019]過河卒二
[FJOI2017]矩陣填數
總結
- 上一篇: whatpulse.exe 启动时报错
- 下一篇: oppok3升降摄像头容易坏吗