zoukankan      html  css  js  c++  java
  • 容斥原理,容斥系数

    容斥原理,容斥系数

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

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

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

    现在我们需要统计(ans=|U igcap overline A_1 igcap overline A_2 cdots igcap overline A_n |)

    (ans=sum_ {S subseteq A}(-1)^{|S|}|U igcap S_ 1 igcap S_ 2 cdots igcap S_ {|S|} |)

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

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

    我们用集合(G_S)来表示满足集合(S)中的所有性质,并且不满足集合(overline S)中的所有性质的元素集合,即(G _ S={ x|forall A _ iin S,x in A _ i , forall A _ iin overline S,x otin A _ i })
    那么我们要求的就是(G_{varnothing})
    (ans=sum_ {S subseteq A}(-1)^{|S|}|U igcap S_ 1 igcap S_ 2 cdots igcap S_ {|S|} |)
    不难得知

    [sum_{T subseteq S,S eq varnothing} (-1)^{|S|} = egin{cases} 1quad (T = varnothing)\ 0quad (otherwise) end{cases}]

    证明:(ans=sum_ {S subseteq A}(-1)^{|S|}|U igcap S_ 1 igcap S_ 2 cdots igcap S_ {|S|} |sum_{G_T} sum_{T subseteq S,S eq varnothing} (-1)^{|S|}=G_{varnothing})
      

    2.Min-Max容斥

    本质上还是容斥的变形。
    Min-Max容斥的核心式子有两个。
    1.(min{max{a,b},c}=max{min{a,c},min{b,c}})
    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}=egin{cases}
    1 quad i=j
    0 quad i eq 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_jsum_{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 inom{n} {i} p_i Leftrightarrow p_n=sum_{i=0}^n (-1)^{n-i} inom {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}egin{Bmatrix}n \ iend{Bmatrix}p_i Leftrightarrow p_n=sum_{i=0}^{n}(-1)^{n-i}egin{bmatrix}n \ iend{bmatrix}q_i ]

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

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

    ([2])带入([1])得到等式([n=i]=sum_{i=0}^n (-1)^{j-i}inom {i}{j} inom {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.斯特林反演
    可以去看我的另外一篇博文第二类斯特林数总结

  • 相关阅读:
    提高网站访问速度的34条军规(7-10)
    指针与函数传参的思考
    提高网站访问速度的34条军规(11-13)
    [置顶] 程序员面试之道(《程序员面试笔试宝典》)之如何回答技术性的问题?
    CentOS6.4 编译安装Python 3.3.2
    hdu 4055 Number String(有点思维的DP)
    解读ASP.NET 5 & MVC6系列(4):核心技术与环境配置
    解读ASP.NET 5 & MVC6系列(6):Middleware详解
    解读ASP.NET 5 & MVC6系列(5):Configuration配置信息管理
    解读ASP.NET 5 & MVC6系列(7):依赖注入
  • 原文地址:https://www.cnblogs.com/gzy-cjoier/p/9686787.html
Copyright © 2011-2022 走看看