zoukankan      html  css  js  c++  java
  • 容斥/反演算法知识简述

    前言

    这只是一个比较基础的容斥/反演学习笔记。
    包含了一大堆锅一些反演的基础知识点和证明过程。
    如有不足之处希望大佬多加指点。

    反演的定义和反演算法的基本原理

    假设有两个函数(f(x))(g(x))满足$$f(n) = sum_{k} a_{n, k} g(k)$$
    已知(f)(g)的过程就叫做反演。
    现在假设我们已经求出了(g)关于(f)的表达式$$g(n)=sum_{k}mu(n,k)f(k)$$
    代入前式,我们有$$f(n)=sum_{k}a_{n,k}sum_{m}mu(k,m)f(m)=sum_{m}f(m)sum_{k}a_{n,k}mu(k,m)$$
    那么只需要(sum_{k}a_{n,k}mu(k,m)=[n=m])即可。
    可以通过矩阵求逆直接求解(mu(n,m))
    一些具有特殊系数的求和式,其(mu)可以快速求出,为解题提供思路。

    求反演式时,一般根据题意设(g(n)sum_{m}[n=m]g(m)),然后将([n=m])表达的式子代入求解,
    整理后根据(f)(g)的关系式代入(f(m))即求解完成。

    二项式反演

    [f(n)=sum_{m=0}^ninom{n}{m}g(m) ]

    我们知道(sum_{i=0}^{n}(-1)^iinom{i}{n}=[n=0]),那么由于([n=m]=[n-m=0]),
    那么从求和式开始变换:

    [egin{aligned} g(n)&=sum_{m=0}^{n}[n-m=0]inom{n}{m}g(m)\ &=sum_{m=0}^{n}sum_{k=0}^{n-m}(-1)^kinom{n-m}{k}inom{n}{m}g(m)\ &=sum_{k=0}^{n}(-1)^kinom{n}{k}sum_{m=0}^{n-k}inom{n-k}{m}g(m)\ &=sum_{k=0}^{n}(-1)^kinom{n}{k}f(n-k)\ end{aligned} ]

    于是有$$g(n)=sum_{k=0}{n}(-1){n-k}inom{n}{k}f(k)$$

    这个过程其实就是在说明:$$sum_{m=k}{n}(-1){m-k}inom{n}{m}inom{m}{k}=[n=k]$$

    子集反演

    [f(S)=sum_{Tsubseteq S}g(T) ]

    (sum_{i=0}^{n}(-1)^iinom{i}{n}=[n=0])可以知道(sum_{Tsubseteq S}(-1)^{|T|}=[S=0]),这里(0)表示空集。

    [egin{aligned} g(S)&=sum_{Tsubseteq S}[S-T=0]g(T)\ &=sum_{Tsubseteq S}sum_{Qsubseteq S-T}(-1)^{|Q|}g(T)\ &=sum_{Qsubseteq S}(-1)^{|Q|}sum_{Tsubseteq S-Q}g(T)\ &=sum_{Qsubseteq S}(-1)^{|Q|}f(S-Q)\ end{aligned} ]

    于是有$$g(S)=sum_{Tsubseteq S}(-1)^{|S|-|T|}f(T)$$

    这个过程其实就是在说明:$$sum_{Tsubseteq Qsubseteq S}(-1)^{|Q|-|T|}=[S=T]$$

    多重子集反演

    现在(S,T)变成了多重集。
    定义(varphi(S)),当(S)中包含重复元素时为(0),不包含时为((-1)^{|S|})
    那么同样有(sum_{Tsubseteq S}varphi(|T|)=[S=0])
    类似上面的变换,可以得到$$g(S)=sum_{Tsubseteq S}varphi(S-T)f(T)$$

    反方向的子集反演

    [f(S)=sum_{Ssubseteq T}g(T) ]

    [egin{aligned} g(S)&=sum_{Ssubseteq T}[T-S=0]g(T)\ &=sum_{Ssubseteq T}sum_{Qsubseteq T-S}(-1)^{|Q|}g(T)\ &=sum_{Ssubseteq Q}(-1)^{|Q|-|S|}sum_{Qsubseteq T}g(T)\ &=sum_{Ssubseteq Q}(-1)^{|Q|-|S|}f(Q)\ end{aligned} ]

    于是有

    [g(S)=sum_{Ssubseteq T}(-1)^{|T|-|S|}f(T) ]

    子集卷积

    [c_S = sum_{T subseteq s} a_T b_{S-T} ]

    对于子集反演,限制集合的大小进行转移即可。

    简而言之,因为之前反方向的子集反演,我们可以处理出

    [c_r = sum_{p,q}[p or q=r]a_pb_q ]

    但如果直接照搬,会出现(p,q)有交的情况
    因此需要限制集合大小,即求(sum_{|r|=k}c_r)时,
    对于(p,q)需要有(p or q)(|p|+|q|=|r|)
    那么对于一类大小为(i)集合地进行(i)次这样的运算即可。故时间复杂度为(O(n^2logn))

    莫比乌斯反演

    [f(n)=sum_{d}[d|n]g(d) ]

    因为每个正整数都能根据质因子分解对应一个质数的多重集,你会发现这其实就是子集反演。
    于是你突然发现再证下去没意思了
    那么定义(mu(n)),当(n)分解出重复质因数时为(0),否则为((-1)^p),其中(p)为质因子个数...
    于是有(sum_{d|n}mu(n)=[n=1])

    [egin{aligned} g(n)&=sum_{d|n}[frac{n}{d}=1]g(d)\ &=sum_{d|n}sum_{t|frac{n}{d}}mu(t)g(d)\ &=sum_{t|n}mu(t)sum_{d|frac{n}{t}}g(d)\ &=sum_{t|n}mu(t)f(frac{n}{t})\ end{aligned} ]

    于是有

    [g(n)=sum_{d|n}mu(frac{n}{d})f(d) ]

    反方向的莫比乌斯反演

    [f(n)=sum_{d}[n|d]g(d) ]

    反方向的多重子集反演。

    [g(n)=sum_{n|d}mu(frac{d}{n})f(d) ]

    单位根反演(离散傅里叶变换)

    egin{aligned}
    f(n)&=sum_{k=0}{m-1}epsilon{nk}g(k)
    g(n)&=frac{1}{m}sum_{k=0}{m-1}epsilon{-nk}f(k)
    end{aligned}
    其中(epsilon=e^{-frac{2pi i}{m}})(m)次单位根,即(epsilon^m=1);
    本人线代太差,不会刚这个式子。有兴趣的大佬可以去这位神仙的博客看看。

    这里反演的直接意义是(DFT)(IDFT)

    还有一个这样的式子:

    [frac{1}{m}sum_{i=0}^{m-1}epsilon^{ni}=[n mod m=0] ]

    证明:当(n mod m ot= 0)时原式(=frac{epsilon^{nm}-1}{epsilon^n-1}=0),当(m|n)(epsilon^n=1)

    斯特林反演

    [egin{aligned} f(n)&=sum_{k=0}^n egin{Bmatrix}n\k\ end{Bmatrix}g(k) \ g(n)&=sum_{k=0}^n(-1)^{n-k}egin {bmatrix} n\k end{bmatrix}f(k)\ end{aligned} ]

    根据上面的反演条件,我们只须考虑证明

    [sum_{m=k}^{n}(-1)^{m-k}egin{Bmatrix}n\m\end{Bmatrix}egin{bmatrix}m\k\end{bmatrix}=[n=k] ]

    这个公式叫做反转公式...
    这个式子还有另一个形式,即$$sum_{m=k}{n}(-1){m-k}egin{bmatrix}nm\end{bmatrix}egin{Bmatrix}mk\end{Bmatrix}=[n=k]$$

    也就是说,斯特林反演包含了不同方向的反演。
    为表示简洁,这里只证其中一个。

    我们考虑两类斯特林数和下降幂,上升幂的关系:

    [n^m=sum_{k=0}^{m}egin{Bmatrix}m\k\end{Bmatrix}inom{n}{k}k!=sum_{k=0}^{m}egin{Bmatrix}m\k\end{Bmatrix}n^{underline{k}} ]

    [n^{overline{m}}=sum_{k=0}^{m}egin{bmatrix}m\k\end{bmatrix}n^k ]

    其中(n^{underline{k}})表示(n)(k)阶下降幂,(n^{overline{k}})表示(n)(k)阶上升幂。

    第一个式子由组合意义立得。使用数学归纳法证明第二个式子:

    [egin{aligned} n^{overline{m}}&=(n+m-1)n^{overline{m-1}}\ &=(n+m-1)sum_{k=0}^{m-1}egin{bmatrix}m-1\k\end{bmatrix}n^k\ &=(m-1)sum_{k=0}^{m-1}egin{bmatrix}m-1\k\end{bmatrix}n^k+sum_{k=0}^{m-1}egin{bmatrix}m-1\k\end{bmatrix}n^{k+1}\ &=sum_{k=1}^{m}egin{bmatrix}m-1\k-1\end{bmatrix}n^k+(m-1)sum_{k=0}^{m-1}egin{bmatrix}m-1\k\end{bmatrix}n^k\ &=sum_{k=0}^{m}n^k(egin{bmatrix}m-1\k\end{bmatrix}+(m-1)egin{bmatrix}m-1\k-1\end{bmatrix})\ &=sum_{k=0}^{m}n^kegin{bmatrix}m\k\end{bmatrix}\ end{aligned} ]

    证毕。

    此时可以证明反转公式:

    [egin{aligned} n^m&=sum_{k=0}^{m}egin{Bmatrix}m\k\end{Bmatrix}n^{underline{k}}\ &=sum_{k=0}^{m}egin{Bmatrix}m\k\end{Bmatrix}(-1)^k(-n)^{overline{k}}\ &=sum_{k=0}^{m}egin{Bmatrix}m\k\end{Bmatrix}(-1)^ksum_{i=0}^{k}(-n)^iegin{bmatrix}k\i\end{bmatrix}\ &=sum_{i=0}^{m}(-n)^isum_{k=i}^{m}egin{Bmatrix}m\k\end{Bmatrix}egin{bmatrix}k\i\end{bmatrix}(-1)^k\ &=sum_{i=0}^{m}n^isum_{k=i}^{m}egin{Bmatrix}m\k\end{Bmatrix}egin{bmatrix}k\i\end{bmatrix}(-1)^{k-i}\ end{aligned} ]

    于是有(sum_{k=i}^{m}egin{Bmatrix}m\k\end{Bmatrix}egin{bmatrix}k\i\end{bmatrix}(-1)^{k-i}=[m=i])。证毕。

    反转公式证明完毕,则斯特林反演的正确性也随之得到证明。

    Min-max容斥(最值反演)

    根据上面的定义,严格的说这玩意应该不属于反演,但它是非常重要的。

    [max{S}=sum_{Tin S}(-1)^{|T|-1}min{T}$$考虑每个元素的出现次数即可证明。 把$max$和$min$交换即可得到另一个公式。 ## 在求lcm上的应用 $$lcm(a_1,a_2,...a_n)=prod_{p}p^{max_{i=1}^{n}r_i}=prod_{p}p^{sum_{Ssubseteq[n]}(-1)^{|S|-1}min_{iin S}r_i}=prod_{Ssubseteq [n]}gcd(S)^{(-1)^{|S|-1}}]

    在期望中的应用

    假设(S)中的元素都是随机变量,两边求期望并根据期望的线性性可以得到$$E(max{S})=sum_{Tin S}(-1)^{|T|-1}E(min{T})$$假设这些随机变量表示一个元素出现的期望时间,且元素之间相互独立。
    那么(max{S})表示S中所有元素至少出现一次的期望时间,
    (min{S})表示S中至少出现一个元素的期望时间

    一般而言(min{S})好求而(max{S})难求,此时通过最值反演即可解决问题。

    Min-max容斥的一个扩展:k-min-max容斥

    我们定义一个容斥系数(f(x)),使得

    [kmax{S}=sum_{Tin S}f(|T|)min{T} ]

    由于是线性变换,假设(|T|=x+1),考虑(min{T})对答案的贡献,为(sum_{i=0}^{x}inom{x}{i}f(i+1))
    于是有$$[x=k-1]=sum_{i=0}^{x}inom{x}{i}f(i+1)$$

    二项式反演可以得到:$$f(x+1)=sum_{i=0}{x}(-1){x-i}inom{x}{i}[i=k-1]=(-1)^{x-k+1}inom{x}{k-1}$$

    于是容斥系数(f(x)=(-1)^{x-k}inom{x-1}{k-1})

    因此$$kmax{S}=sum_{Tin S}(-1)^{|T|-k}inom{|T|-1}{k-1}min{T}$$

    参考资料:
    炫酷反演魔术
    斯特林数-斯特林反演
    min-max容斥及其推广

  • 相关阅读:
    linux初学者-正则表达式
    linux初学者-文件管理篇
    linux初学者-常用基本命令篇
    初学者的linux
    java中接口的定义和接口的实现
    深入理解Java的接口和抽象类
    在pom.xml中的dependencies点击add怎么没有搜索到相关jar包
    json对象(对象+数组)
    poi导出模板(我的备份)
    js对象和数组的定义
  • 原文地址:https://www.cnblogs.com/cjfdf/p/10325097.html
Copyright © 2011-2022 走看看