zoukankan      html  css  js  c++  java
  • 从 0 开始的min_max容斥证明

    远古文章,谨慎食用

    二项式反演

    [f_n=sumlimits_{i=0}^nC^i_ng_i Leftrightarrow g_n=sumlimits_{i=0}^n{(-1)}^{n-i}f_i ]

    证明:

    容斥原理

    [|A_1 cup A_2cupcdotscup A_n|=sumlimits_{1le ile n}|A_i|-sumlimits_{1le i<jle n}|A_icap A_j|+cdots+(-1)^{n-1} imes |A_1cap A_2cap cdots cap A_n| ]

    证明:显然

    如果一个元素 (p)(m) 个集合包含,那么 (p) 对于左侧的贡献是 (1)

    对于右侧的贡献:

    [ sumlimits_{i=1}^m(-1)^{i-1}C^i_m\large=-sumlimits_{i=1}^m(-1)^{i}C^i_m\large = 1-sumlimits_{i=0}^m(-1)^{i}C^i_m\large=1-(1-1)^m=1 ]

    二项式定理

    [(x+y)^n=sumlimits_{i=0}^nC^i_n x^i y^{n-i} ]

    这个柿子可以理解为 ,(n) 个括号,每个括号选择 (x)(y) ,其中 (i) 个选了 (x) ,那么其余 (n-i) 个必然是(y) ,所以 (x^i y^{n-i}) 的系数是 (n) 个括号选择 (i) 个的方案数,即 (C^i_n)

    容斥原理的最后一步就是这么证明的。


    接着证明二项式反演

    设集合 (A_i) 的补集是 (B_i) ,全集是 (U)(C_A) 表示 (A) 的补集

    那么(A_1 cup A_2cupcdotscup A_n) 的补集就是 (B_1 cap B_2capcdotscap B_n) ,结合容斥原理可得

    [|B_1 cap B_2capcdotscap B_n|=|U|-sumlimits_{1le ile n}|A_i|-sumlimits_{1le i<jle n}|A_icap A_j|+cdots+(-1)^{n-1} imes |A_1cap A_2cap cdots cap A_n| ]

    [ecause C_{C_A}=A\ herefore |A_1 cap A_2capcdotscap A_n|=|U|-sumlimits_{1le ile n}|B_i|-sumlimits_{1le i<jle n}|B_icap B_j|+cdots+(-1)^{n-1} imes |B_1cap B_2cap cdots cap B_n| ]

    考虑一种特殊情况:集合的交集大小只与集合个数有关。给出一种可行的情况: (U={1,2,cdots,2n},A_i={1,2,cdots,i-1,i+1,cdots,n,i+n})

    于是珂以令 (f(i))(i) 个集合补集的交集大小, (g(i))(i) 个原集的大小。

    得到:

    [f(n)=sumlimits_{i=0}^n(-1)^iC^i_ng(i)Leftrightarrow g(n)=sumlimits_{i=0}^n(-1)^iC^i_nf(i) ]

    (h(i)=(-1)^ig(i)) ,那么

    [ f(n)=sumlimits_{i=0}^n(-1)^iC^i_ng(i)=sumlimits_{i=0}^nC^i_nh(i)Leftrightarrow g(n)=dfrac{h(n)}{(-1)^n}=sumlimits_{i=0}^n(-1)^{i}C^i_nf(i)\ 即f_n=sumlimits_{i=0}^nC^i_nh_i Leftrightarrow h_n=sumlimits_{i=0}^n{(-1)}^{n-i}C_{n}^{i}f_i ]

    Min_Max 容斥

    给定集合 (S) ,设 (max(S),min(S)) 分别为 (S) 中的最大、最小值,那么

    [max(S)=sumlimits_{Tsubseteq S}(-1)^{|T|+1}min(T) ]

    证明:

    考虑构造一个系数 (f(i)) 使得 (max(S)=sumlimits_{Tsubseteq S}f(|T|)min(T))

    不妨 (S={1,2,cdots,n})

    考虑通过枚举哪些集合的最小值是 (x+1) 计算这个第 (x+1) 大的数的贡献,这个那么贡献就是 (sumlimits_{i=0}^xC^i_xf(i+1))

    而我们希望这个柿子只有在 (x=0) 的时候恰好是 (1) ,其余时候都是 (0) ,这样等式右边一加恰好是 (S) 的最大数,等于等式左边,则

    [[x==0]=sumlimits_{i=0}^xC^i_xf(i+1) ]

    套用之前的二项式反演公式,设 (A(x)=[x==0],B(x)=f(i+1))

    由于 (A(x)=sumlimits_{i=0}^nC^i_nB(i))

    可以得到 (B(x)=sumlimits_{i=0}^x(-1)^{x-i}A(i))

    (f(x+1)=sumlimits_{i=0}^x(-1)^{x-i}[i==0]=(-1)^x)

    所以 (f(x)=(-1)^{x+1})

    (max(S)=sumlimits_{Tsubseteq S}(-1)^{|T|+1}min(T))

    证毕!

    参考资料

    http://blog.miskcoo.com/2015/12/inversion-magic-binomial-inversion

    https://www.cnblogs.com/GXZlegend/p/11407185.html

    https://blog.csdn.net/dt_kang/article/details/88805837

    路漫漫其修远兮,吾将上下而求索
  • 相关阅读:
    程序员需要知道的知识
    ajax原理图
    线性表及其操作
    JDBC连接SQL server 2005 全过程
    asp.net生命周期
    终于在博客园里申请了自己的博客
    C#反射类中所有字段,属性,方法
    继续学习NHibernate
    C#中方法的四种参数类型
    Forms权限认证
  • 原文地址:https://www.cnblogs.com/zzctommy/p/13326994.html
Copyright © 2011-2022 走看看