zoukankan      html  css  js  c++  java
  • 「反演」学习笔记

    「反演」学习笔记

    小声bb:本来看skyh推的博客,是来学容斥的,莫名其妙被强塞了反演

    概念

    好多童鞋还不知道啥是反演,反正听起来挺牛逼的,谁会谁被膜

    比如说有两个未知量 (x,y),我们用 (x) 表达出来了 (y),比如一个一次函数:

    [y=kx+b ]

    那么我们用 (y) 表示 (x) 就是:

    [x=frac{y-b}{k} ]

    (emmmm),这差不多就是个反演。

    然后我们就搞高级一点:

    假设有两个函数 (f)(g) 满足:

    [f[n] = sum_{k}a_{n,k} imes g[k] ]

    已知 (f)(g) 的过程就叫做「反演」。

    二项式反演

    例题

    (n) 个小盆友,每个人有一个编号 (1,2...,n)

    将这 (n) 个小盆友排成一列,编号为 (i) 的小盆友不能在第 (i) 个位置。

    求出所能排队的方案数,(nleq 10^5)

    简单容斥(听说小学生都会??)

    • 假设 (n=3)

    我们拿出高一老师(??)常拿的韦恩图像:

    定义:

    (A) 集合:编号为 (1) 的小盆友站到 (1) 的方案数。

    (B) 集合:编号为 (2) 的小盆友站到 (2) 的方案数。

    (C) 集合:编号为 (3) 的小盆友站到 (3) 的方案数。

    我们要求的就是 (n! - |Acup Bcup C|),用简单的容斥可得:

    (ans=n! - (|A|+|B|+|C|-|Acap B|-|Bcap C|-|Acap C|+ |Acap Bcap C|))

    得出公式

    我们可以大胆猜想:

    [ans = sum_{k=0}^{n}(-1)^k imes inom{n}{k} imes (n - k)!;(假设 0! = 1) ]

    • 什么意思?

    (inom{n}{k} imes (n - k)!) 表示强硬的将 (k) 个人放到自己应该放的位置((i) 放到第 (i) 个位置),剩下 (n-k) 个人随便放的方案数。

    • 为啥要加一个 ((-1)^k)

    比如说你加上了一个 (k=2) 的方案数,强硬地将 (2) 个人,后面我们统计 (k=3) 时,我们会发现:在前面 (k=2) 时,可能有某个小盆友被放到了自己应该放的位置,所以要

    减去这些被多余统计的方案,加法同理。

    新定义

    定义 (f[n]) 表示 (n) 个人随便站的方案数。

    定义 (g[n]) 表示 (n) 个人都不站在自己应该在的位置的方案数。

    这样我们直接枚举有多少个人站错位置,便可求出 (f[n])

    [f[n]=sum_{k=0}^{n} imes inom{n}{k} imes g[k] ]

    但是我们会发现,我们可以直接用 (f[n] = n!) 求出 (f[n]),而且我们还不会求出 (g[n]),难受~~~

    小钥匙

    我们会发现之前解决那个例题的公式中有一个这个东东:

    [sum_{k=0}^{n}(-1)^k imes inom{n}{k} ]

    易得:这个东东只有 (n=0) 时才为 (1),否则即为 (0)

    • 我们再引进一个神犇数学符号:([P]),表示条件 (P) 符合时,为 (1);否则即为 (0),(好像一个 (bool))。

    所以上面那个东东就可以化为:

    [sum_{k=0}^{n}(-1)^k imes inom{n}{k}=[n=0] ]

    反演

    之前我们新定义里:

    (g[n]) 表示出了 (f[n]),然而我们并不知道 (g[n]),反而知道 (f[n]),我们就需要一些骚操作(繁衍呸,反演),来求出 (g[n])

    说一句废话:

    [g[n] = sum_{m=0}^{n}[n=m] imes inom{n}{m} imes g[m] ]

    改一下这个废话:

    [g[n] = sum_{m=0}^{m}[n-m=0] imes inom{n}{m} imes g[m] ]

    哦!!!中间那个条件,我们是不是可以用一下那个小钥匙?

    [g[n] = sum_{m=0}^{n} sum_{k=0}^{n-m}(-1)^k imes inom{n-m}{k} imes inom{n}{m} imes g[m] ]

    看一看中间那两个恶心的组合数:

    可以考虑为从 (n) 个物品里,先选 (m) 个,再从 (n-m) 个里选 (k) 个的方案数。

    可以变为为从 (n) 个物品里,先选 (k) 个,再从 (n-k) 个里选 (m) 个的方案数,组合数可以变为: (inom{n-k}{m} imes inom{n}{k})

    原式变为:

    [g[n] = sum_{m=0}^{n} sum_{k=0}^{n-m}(-1)^k imes inom{n-k}{m} imes inom{n}{k} imes g[m] ]

    交换一下:

    [g[n] = sum_{m=0}^{n} sum_{k=0}^{n-m}(-1)^k imes inom{n-k}{m} imes g[m] imes inom{n}{k} ]

    然后将 (m)(k) 交换一下:

    [g[n] = sum_{k=0}^{n} sum_{m=0}^{n-k}(-1)^k imes inom{n-k}{m} imes g[m] imes inom{n}{k} ]

    再次交换:

    [g[n] = sum_{k=0}^{n} (-1)^k imes inom{n}{k} sum_{m=0}^{n-k} inom{n-k}{m} imes g[m] ]

    诶!!后面那个东东就是 (f[n - k]),可,我们成功了!!!

    [g[n] = sum_{k=0}^{n} (-1)^k imes inom{n}{k} imes f[n-k] ]

    (emmmm),好丑,写好看一点:

    [g[n] = sum_{k=0}^{n} (-1)^{n-k} imes inom{n}{k} imes f[k] ]

    得出结果

    [f[n]=sum_{k=0}^{n} imes inom{n}{k} imes g[k] ]

    [g[n] = sum_{k=0}^{n} (-1)^{n-k} imes inom{n}{k} imes f[k] ]

    这个好像就是二项式反演

    可能与 (A) 层的巨佬们学的有点不同,有错误,请见谅我这个蒟蒻。

    莫比乌斯反演

    例题

    小盆友学英语,他拿到 (26) 个小写字母,他拼出若干个长度为 (n) 的字符串,求出有多少个字符串的循环节恰好为 (n)(nleq 10^9)

    连小盆友都知道循环节是啥,不用我说吧....(最短的一个子串复制若干遍后拼起来跟原串相等的字符串)。

    新定义

    定义 (f[n]) 表示长度为 (n) 的字符串的个数,显然是 (26^n)

    定义 (g[n]) 表示长度为 (n) 且循环节长度为 (n) 的字符串的个数。

    可以得出:

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

    小钥匙

    上次我们用了一个条件表达式,打开了反演的关键,这个我们同样搞一个:

    定义一个 (mu[n]) 满足:(莫某某某搞的)

    [sum_{d|n}mu[d] = [n=1] ]

    其实这个就是莫比乌斯函数,至于性质,可以看一眼龙蝶的

    反演

    同样,我们说一句废话:

    [g[n] = sum_{m|n}[n=m] imes g[m] ]

    将条件表达式变一下:

    [g[n] = sum_{m|n}[frac{n}{m}=1] imes g[m] ]

    好,用我们的小钥匙:

    [g[n] = sum_{m|n}sum_{d|frac{n}{m}} imes mu[d] imes g[m] ]

    上次我们将 (m)(k) 进行了交换,这次怎么处理呢?

    我们会发现 (n) 能将 (m) 整除,(frac{n}{m}) 能将 (d) 整除,所以我们可以得出 (n) 既能将 (m) 整除,又能将 (d) 整除,这样我们就可以将 (m)(k) 交换了。

    [g[n] = sum_{d|n}sum_{m|frac{n}{d}} imes mu[d] imes g[m] ]

    交换一下:

    [g[n] = sum_{d|n} imes mu[d]sum_{m|frac{n}{d}} imes g[m] ]

    不错,后面那个东东又可以化为我们的 (f),可

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

    得出结果

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

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

    这个好像就是莫比乌斯反演

    其他反演敬请期待

  • 相关阅读:
    经典机器学习算法总结
    从0开始学Python---01
    Android-Canvas.save() Canvas.restore() 总结
    Android-属性动画原理总结
    设计模式-外观模式
    设计模式-模板方法
    设计模式-装饰者模式
    设计模式-策略模式
    设计模式-工厂方法模式
    设计模式-简单工厂模式
  • 原文地址:https://www.cnblogs.com/Rubyonly233/p/13778435.html
Copyright © 2011-2022 走看看