Processing math: 18%

容斥原理,容斥系数

容斥原理,容斥系数

众所周知,容斥原理是计数问题中最鸡贼的东西.基本上很多计数问题都要用到容斥,但是有的时候你明明知道要容斥就是不知道怎么容斥.所以特此写在这里总结一下.

1.简单傻逼的容斥原理。

一般来说,这种容斥原理一般有n个性质,满足第i个性质的元素集合为Ai,还有一个全集U

现在我们需要统计ans=|U¯A1¯A2¯An|

ans=SA(1)|S||US1S2S|S||

如果用组合意义来说的话,xAi是代表元素x具有性质i,我们要求的就是不具有所有性质的元素个数。

这个这个定理的证明如下。

我们用集合GS来表示满足集合S中的所有性质,并且不满足集合¯S中的所有性质的元素集合,即GS={x|AiS,xAi,Ai¯S,xAi}
那么我们要求的就是G
ans=SA(1)|S||US1S2S|S||
不难得知

TS,S(1)|S|={1(T=)0(otherwise)

证明:ans=SA(1)|S||US1S2S|S||GTTS,S(1)|S|=G
  

2.Min-Max容斥

本质上还是容斥的变形。
Min-Max容斥的核心式子有两个。
1.min
2.\max\{a,b\}=a+b-\min\{a,b\}
正确性显然。
基于第一个结论,我们猜测ans=\max_{i=1}^n{a_i}=\sum_{ T \subseteq A} (-1)^{|T|+1}\min { T}
显然可以归纳证明。

ans=\max_{i=1}^n\{a_i\}=\max_{i=1}^{n-1}\{a_i\} + a_n -\min\{\max_{i=1}^{n-1}\{a_i\} ,a_n\} \\=\max_{i=1}^{n-1}\{a_i\} + a_n -\max_{i=1}^{n-1}\{\min\{a_i ,a_n\}\} \\=\sum_{ T \subseteq A} (-1)^{|T|+1}\min\{ T\} + (-1)^{|T|+2}\min\{T,a_n\}+a_n \\=\sum_{ T \subseteq A}(-1)^{|T|+1}\min \{ T\}

upd:上面写的证明太复杂了,其实只需要按照元素大小排序,那么可以化归到已知的简单容斥里去了。

3.更加毒瘤的容斥原理

假设我们有长度为n+1的数列\{|A_i|\}分别代表具有性质A_i的集合元素的个数。
通常,我们需要计算的是s(A_i),即性质A_i对答案造成的贡献。
但是某些情况下s(A_i)太难计算,我们引入长度为n+1的数列\{|B_j|\},代表具有性质B_j的集合元素个数。
假如我们可以知道关系式s(B_j)=\sum_{i=0}^nf_{j,i}s(A_i)
那么我们可以构造一个关系s(A_i)=\sum_{j=0}^n g_{i,j}s(B_j)
如果我们将第一个代入第二个会发生什么呢?
  s(A_i)=\sum_{j=0}^n g_{i,j} \sum_{l=0}^n f_{j,l} s(A_l)   \=\sum_{l=0}^n s(A_l) \sum_{j=0}^n g_{i,j}f_{j,l}
假如我们设h_{i,l}=\sum_{i=0}^n g_{i,j}f_{j,l},有s(A_i)=\sum_{j=0}^n h_{i,j}s(A_j)
显然可以知道
  h_{i,j}=\begin{cases} 1 \quad i=j\ 0 \quad i\neq j   \end{cases}
那么如果我们把F,G,H都当作矩阵的话,那么H就是单位矩阵E,而且FG=E
那么G=F^{-1}
这样我们就得到了容斥系数矩阵G,按照最暴力的方法求是O(n^3)的。
再直接带入容斥系数就可以O(n^2)算出\sum_{i=0}^n s(A_i)的值了。
  
等等!为什么我碰到的容斥题都是n=10^5,n=2000,从来就没有见过可以O(n^3)做的容斥题啊。
很多时候B_i都是由我们自己构造,既然自己构造的话就可以鸡贼一点,比如说我们构造\{B_i\},令其对\{A_i\}的转移矩阵F是一个下三角矩阵。
这样的话就相当于s(B_i)=\sum_{j=0}^i s(A_j) f_{i,j},我们可以依次解出\{A_i\}的值。
或者对这个下三角矩阵求逆,利用矩阵G\{B_i\}直接求出\{A_i\}
那这样我会O(n^2)的了,可是那些O(n)的题是怎么做的啊。
有些时候,题目只要求求某个性质的值,比如s(A_n),按照常规做法,你就不得不递推出其他所有的容斥矩阵。
但是如果我们一开始就知道了这些性质的容斥矩阵,岂不是就可以直接用对应的\{B_i\}转移给a_0。所以,某些时候,我们可以自己手算或者打表找出转移矩阵的容斥系数。
不过如果用矩阵来表示的容斥有时候比较繁琐,于是便有了系数的形式。
假如我们要算ans=\sum_{i=0}^n p_i s(A_i)
可以构造容斥系数q_j,令ans=\sum_{j=0}^n q_j s(B_j)
ans=\sum_{j=0}^n q_j\sum_{i=0}^n f_{j,i} s(A_i) \=\sum_{i=0}^n s(A_i)\sum_{j=0}^n q_j f_{j,i} =\sum_{i=0}^n p_i s(A_i)
有等式p_i=\sum_{j=0}^n f_{j,i} q_j
如果F是上三角或者下三角矩阵,我们求出q_j就只需要O(n^2)的时间。
特别的,如果f_{j,i}可以被表示成两个函数如h(j)h(i-j)的积,那么上式还是一个卷积的形式,可以多项式求逆在O(nlogn)的时间内求出容斥系数。
大多数情况下,容斥系数都是有迹可寻的,可以猜想一些可靠的容斥系数然后自己手推式子或者打表证明一下,当然复杂度允许的话也可以递推或者对矩阵求逆
在特殊情况下,还有一些经典的容斥系数。
  
1.组合数形式的容斥(二项式反演):

q_n=\sum_{i=0}^n \binom{n} {i} p_i \Leftrightarrow p_n=\sum_{i=0}^n (-1)^{n-i} \binom {n} {i} q_i

  
2.倍数关系的容斥(莫比乌斯反演)。

q_n=\sum_{d|n} p_d \Leftrightarrow p_n=\sum_{d|n} \mu( {n \over d}) q_d

q_n=\sum_{n|d} p_d \Leftrightarrow p_n=\sum_{n|d} \mu( {d \over n}) q_d

  
3.斯特林数形式的容斥(斯特林反演)。

q_n=\sum_{i=1}^{n}\begin{Bmatrix}n \\ i\end{Bmatrix}p_i \Leftrightarrow p_n=\sum_{i=0}^{n}(-1)^{n-i}\begin{bmatrix}n \\ i\end{bmatrix}q_i

upd:对于三个反演的证明。
1.二项式反演
由二项式定理可知,

(x+1)^n=\sum_{i=0}^n \binom {n} {i} x^i \quad[1]\\ x^n=\sum_{i=0}^n (-1)^{n-i}\binom {n} {i} (x+1)^i \quad[2]

[2]带入[1]得到等式[n=i]=\sum_{i=0}^n (-1)^{j-i}\binom {i}{j} \binom {n}{i}
将反演式子互相带入可以得到等价与该等式。

2.莫比乌斯反演(只证第一个)
莫比乌斯函数满足性质,[n=1]=\sum_{d|n} \mu(d)
即满足与衡等函数I的狄利克雷卷积为单位函数e,(\mu * I)(n)=e(n)=[n=1]
当然这是狄利克雷卷积,如果是矩阵的话,那么就是矩阵
\mu_{i,j}=[j|i]mu({i \over j}) ,I_{i,j}=[j|i]相乘,显然这是满足\mu I=E的。
第二个的证明就是把整除符号的两边反过来,本质上没有什么区别。

3.斯特林反演
可以去看我的另外一篇博文第二类斯特林数总结

posted @   Deadecho  阅读(5119)  评论(8编辑  收藏  举报
点击右上角即可分享
微信分享提示