• 莫比乌斯反演


    前置知识:数论分块、狄利克雷卷积

    莫比乌斯函数

    莫比乌斯函数的符号是 \(\mu\),定义为

    \[\mu(n)=\begin{cases}1,&n=1\\(-1)^k,&n=p_1p_2\cdots p_k\\0,&\rm otherwise\end{cases} \]

    • 规定 \(\mu(1)=1\)

    • \(n\ne 1\) 时,将 \(n\) 分解质因数:\(n=p_1^{\alpha_1}p_2^{\alpha_2}\cdots p_k^{\alpha_k}\)

      • 若每个质因子均只出现一次(所有 \(\alpha_i\) 都为 1),则 \(\mu(n)=(-1)^k\)
      • 否则,\(n\) 有平方因子(存在 \(d^2|n\)),此时 \(\mu(n)=0\)

    一些性质(证明略):

    • \(\mu\) 是积性函数。
      这意味着 \(\mu\) 可以线性筛求。

    • \(\sum\limits_{d\mid n}\mu(d)=[n=1]\)
      非常有用非常重要的性质。

    狄利克雷卷积

    我们定义函数 \(f(n),g(n)\) 的狄利克雷卷积为

    \[(f*g)(n)=\sum_{d\mid n}f(d)g\Big(\frac nd\Big) \]

    狄利克雷卷积满足交换律、结合律。
    两个积性函数的狄利克雷卷积也是积性函数。

    \(\varepsilon(n)=[n=1],I(n)=1,id(n)=n\)。我们还有如下结论:

    • \(f*\varepsilon=f\)(其中 \(f\) 为任意数论函数)。即 \(\varepsilon\) 是狄利克雷卷积的单位元。

    • \(\mu*I=\varepsilon\)。也就是 \(\sum\limits_{d\mid n}\mu(n)=[n=1]\)。即 \(\mu\)\(I\) 互为逆元。
      根据这条结论我们可以得到

      \[f=g*I\Longleftrightarrow g=f*\mu \]

      或者写成

      \[f(n)=\sum_{d\mid n}g(n)\Longleftrightarrow g(n)=\sum_{d\mid n}\mu(d)f\Big(\frac nd\Big) \]

      这种操作被称为莫比乌斯反演。

    • \(\varphi*I=id\)。也就是 \(\sum\limits_{d\mid n}\varphi(d)=n\)

    莫比乌斯反演

    内容上面讲过了,这里写一下实际做题时怎么用。

    洛谷P4450 双亲数

    题意:求 \(\sum\limits_{i=1}^A\sum\limits_{j=1}^B[(i,j)=d]\)
    \(1\le A,B\le 10^6,1\le d\le\min(A,B)\)

    首先给出常用套路:\([(i,j)=1]=\sum\limits_{t|(i,j)}\mu(t)=\sum\limits_{t|i,t|j}\mu(t)\)

    接下来就是推式子了。
    为了方便,约定 \(x/y\) 表示整除,即 \(\lfloor\tfrac xy\rfloor\)
    \(x/yz\) 的意思是 \(\lfloor\tfrac x{yz}\rfloor\) 而不是 \(\lfloor\tfrac xy\rfloor z\)

    \(\begin{aligned} \sum_{i=1}^A\sum_{j=1}^B[(i,j)=d] &=\sum_{i=1}^{A/d}\sum_{j=1}^{B/d}[(i,j)=1]\\ &=\sum_{i=1}^{A/d}\sum_{j=1}^{B/d}\sum_{t|(i,j)}\mu(t)\\ &=\sum_{t=1}^{\min(A,B)/d}\mu(t)\sum_{i=1}^{A/d}[t|i]\sum_{j=1}^{B/d}[t|j]\\ &=\sum_{t=1}^{\min(A,B)/d}\mu(t)(A/dt)(B/dt) \end{aligned}\)

    \(\mu\) 可以线性筛求。这样我们就得到了 \(O(\min(A,B)/d)\) 的正解。

    洛谷P1829 [国家集训队]Crash的数字表格 / JZPTAB

    \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m{\rm lcm}(i,j)\) 的值。
    答案可能比较大,所以对 \(20101009\) 取模。
    \(1\le n,m\le 10^7\)

    式子中出现 \(\rm lcm\) 时一般要化为 \(\gcd\) 处理。
    \(N=\min(n,m)\)

    \(\begin{aligned} \sum_{i=1}^n\sum_{j=1}^m{\rm lcm}(i,j) &=\sum_{d=1}^N\sum_{i=1}^n\sum_{j=1}^m[(i,j)=d]\frac{ij}d \\ &=\sum_{d=1}^Nd\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[(i,j)=1]ij \\ &=\sum_{d=1}^Nd\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}\sum_{t|i,t|j}\mu(t)ij\\ &=\sum_{d=1}^Nd\sum_{t=1}^{N/d}\mu(t)\sum_{i=1}^{n/d}[t|i]i\sum_{j=1}^{m/d}[t|j]j\\ &=\sum_{d=1}^Nd\sum_{t=1}^{N/d}\mu(t)t^2S(n/dt)S(m/dt) \end{aligned}\)

    其中 \(S(n)=\dfrac{n(n+1)}2\)

    最后的式子可以用两层数论分块计算。
    时间复杂度瓶颈在线性筛求 \(\mu\) 的部分,为 \(O(N)\)

    欧拉反演

    (其实这个名字好像并不怎么正式)

    大部分莫反题都是用 \(\sum\limits_{d\mid n}\mu(d)\) 代换式子中出现的 \([n=1]\)
    但在某些情形下,存在另一种做法:用 \(\sum\limits_{d\mid n}\varphi(d)\) 代换式子里的 \(n\)

    洛谷P1447 [NOI2010] 能量采集

    \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m2\gcd(i,j)-1\)
    \(1\le n,m\le 10^5\)

    \(S=\sum\limits_{i=1}^n\sum\limits_{j=1}^m\gcd(i,j)\),则答案为 \(2S-nm\)。只需求出 \(S\) 即可。

    \(N=\min(n,m)\)

    常规做法第一步是将式子化为 \(\sum\limits_{d=1}^Nd\sum\limits_{i=1}^n\sum\limits_{j=1}^m[(i,j)=d]\),然后用莫反推。但其实用欧拉反演会更简单:

    \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m\gcd(i,j) =\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{d\mid i,d\mid j}\varphi(d) =\sum\limits_{d=1}^N\varphi(d)(n/d)(m/d)\)

    线性筛求 \(\varphi\) 即可做到 \(O(N)\) 计算。

    可以看出,适当使用欧拉反演代替莫反可以简化运算。
    但相对莫反而言,欧拉反演的适用范围较小,一般只能用于解决 \(\gcd\) 求和之类的问题。
    比如我们把 \(\sum\) 换成 \(\prod\),得到 \(\prod\limits_{i=1}^n\prod\limits_{j=1}^m\gcd(i,j)\) 这种累乘式,欧拉反演就不可做了。
    此时正解是在指数上做莫反。

    洛谷P3704 [SDOI2017]数字表格

    \(T\) 组数据,求 \(\prod\limits_{i=1}^n\prod\limits_{j=1}^mF_{\gcd(i,j)}\) 的值。
    其中 \(F\) 为 Fibonacci 数列,\(F_1=F_2=1\)。对 \(10^9+7\) 取模。
    \(1\le T\le 10^3,1\le n,m\le 10^6\)

    \(N=\min(n,m)\)

    \(\begin{aligned} \prod_{i=1}^n\prod_{j=1}^mF_{\gcd(i,j)} &=\prod_{d=1}^NF_d^{\sum_{i=1}^{n/d}~\sum_{j=1}^{m/d}~~[(i,j)=1]} \\ &=\prod_{d=1}^NF_d^{\sum_{t=1}^{N/d}~~\mu(t)(n/dt)(m/dt)}\\ &=\prod_{T=1}^N\left(\prod_{d\mid T}F_d^{\mu(T/d)}\right)^{(n/T)(m/T)} \end{aligned}\)

    最后一步是一个常用技巧,令 \(T=dt\) 后变换求和(积)号。

    括号内的部分可以预处理,复杂度是调和级数 \(O(n\ln n)\)
    然后数论分块计算即可。总时间复杂度 \(O(n\ln n+T\sqrt n\log n)\)

    莫比乌斯反演的扩展

    我们定义一种运算 \(\oplus\) 如下:

    \[(f\oplus g)(n)=\prod_{d\mid n}f(d)^{g\left(\tfrac nd\right)} \]

    这种运算显然既不满足交换律,也不满足结合律,似乎很逊。但它有一个神奇的性质:

    \[(f\oplus g)\oplus h=f\oplus (g*h) \]

    其中 \(*\) 为狄利克雷卷积。
    证明比较简单,读者可自行完成。

    然后我们就有了一种奇怪的莫比乌斯反演:

    \[f=g\oplus I\Longleftrightarrow g=f\oplus\mu \]

    也可以写成

    \[f(n)=\prod_{d|n}g(d)\Longleftrightarrow g(n)=\prod_{d|n}f\Big(\frac nd\Big)^{\mu(d)} \]

    其实也没啥特别的,取个对数就变成普通莫反了…

    这里再补充一种非卷积形式的莫比乌斯反演:

    \[f(n)=\sum_{d=1}^nt(d)g(n/d)\Longleftrightarrow g(n)=\sum_{d=1}^n\mu(d)t(d)f(n/d) \]

    这里要求 \(t\) 是完全积性函数,即无论 \(a,b\) 是否互质,\(t(ab)=t(a)t(b)\) 都成立。

    同理有

    \[f(n)=\prod_{d=1}^ng(n/d)^{t(d)}\Longleftrightarrow g(n)=\prod_{d=1}^nf(n/d)^{\mu(d)t(d)} \]

    瞎扯部分

    写一点自己对莫反的理解

    笔者学习莫反时曾有过这样的疑惑:为什么一堆莫反题都只是在用 \(\sum\limits_{d|n}\mu(d)=[n=1]\) 推式子,所谓的反演到底体现在哪里呢?

    比如说 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m[(i,j)=1]=\sum\limits_{d=1}^{\min(n,m)}\mu(d)(n/d)(m/d)\),我们考虑怎样才能让它和反演扯上关系。

    把上面提到的莫反的非卷积形式魔改一下:

    \[f(n,m)=\sum_{d=1}^{\min(n,m)}g(n/d,m/d)\Longleftrightarrow g(n,m)=\sum_{d=1}^{\min(n,m)}\mu(d)f(n/d,m/d) \]

    (正确性是可以证明的,但这不是重点,因此不再赘述)

    \(f(n,m)=nm,g(n,m)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m[(i,j)=1]\),则右式成立。

    不妨看一下此时左式长啥样:\(\sum\limits_{d=1}^{\min(n,m)}~\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{m/d}[(i,j)=1]=nm\)

    可以这样理解:对于每一个数对 \((x,y)\),将其按 \(d=\gcd(x,y)\) 分类,数对的总数恒为 \(nm\)。式子中的 \(i,j\) 对应了 \(x/d,y/d\)

    如果我们知道按 \(\gcd\) 分类的这种技巧,就可以直接得到左式,从而由莫反推出右式。

    于是对于一道莫反题,我们有了两种做法:

    1. \(\sum\limits_{d|n}\mu(d)=[n=1]\) 的性质做代换,然后变换求和号(推式子)。
    2. \(\gcd\) 分类的思想弄出一个式子,然后做莫比乌斯反演。

    例题:证明 \(\mu*id=\varphi\)
    (其实由 \(\varphi*I=id\) 反演一下即可得到,但我们假装这个性质不能用)

    1. 推式子。
      \(\begin{aligned} \varphi(n)&=\sum\limits_{i=1}^n[(i,n)=1]\\ &=\sum\limits_{i=1}^n\sum\limits_{d|i,d|n}\mu(d)\\ &=\sum\limits_{d|n}\mu(d)(n/d) \end{aligned}\)
      \(\varphi=\mu*id\)

    2. \(n\) 以内的正整数按 \(d=\gcd(i,n)\) 分类,得到
      \(\begin{aligned} n&=\sum\limits_{d|n}\sum\limits_{i=1}^n[(i,n)=d]\\ &=\sum\limits_{d|n}\sum\limits_{i=1}^{n/d}[(i,n/d)=1]\\ &=\sum\limits_{d|n}\varphi(n/d)\\ &=\sum\limits_{d|n}\varphi(d) \end{aligned}\)
      于是我们证明了 \(\varphi*I=id\),从而有 \(\mu*id=\varphi\)

    如果题目就是要证 \(\varphi*I=id\),解法 2 会明显更为简洁优美。
    但相对而言解法 1 技巧性不强,实际做题时会更好用。

    最后来欣赏一波牛逼操作(

    \[\sum_{i=1}^n\sum_{j=1}^mf(\gcd(i,j))=\sum_{d=1}^{\min(n,m)}(f*\mu)(d)(n/d)(m/d) \]

    \(f\)\(\varepsilon\),得 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m[(i,j)=1]=\sum\limits_{d=1}^{\min(n,m)}\mu(d)(n/d)(m/d)\),即洛谷P4450 双亲数

    \(f\)\(id\),得 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m\gcd(i,j)=\sum\limits_{d=1}^{\min(n,m)}\varphi(d)(n/d)(m/d)\),即洛谷P1447 [NOI2010] 能量采集

    \(F\) 为 Fibonacci 数列,且使用 \(\prod\) 形式的莫反,
    \(f(n)=F_n\),得 \(\prod\limits_{i=1}^n\prod\limits_{j=1}^mF_{\gcd(i,j)}=\prod\limits_{d=1}^{\min(n,m)}(f\oplus\mu)(d)^{(n/d)(m/d)}\) ,即洛谷P3704 [SDOI2017]数字表格

  • 相关阅读:
    C#---将数据库数据转换为json格式
    ASP.NET ---根据值让树中某一节点选中
    SQL---查询树中某个节点及其所有子节点
    CSS---相对定位笔记
    CSS---绝对定位笔记
    滑雪
    Self Numbers
    Lotto
    Parencodings
    Robot Motion
  • 原文地址:https://www.cnblogs.com/REKonib/p/16150523.html
Copyright © 2020-2023  润新知