莫比乌斯反演

目录

目录地址

上一篇

下一篇


莫比乌斯反演的原理

由定义,对于两个积性函数 \(\boldsymbol f,\boldsymbol g\) 若满足 \(\displaystyle \boldsymbol g(n)=\sum_{d\mid n}\boldsymbol f(d)\)

则根据 \(\boldsymbol g=\boldsymbol f*\boldsymbol I\) 反推出 \(\boldsymbol f=\boldsymbol g*\boldsymbol \mu\)

从而有 \(\displaystyle \boldsymbol f(n)=\sum_{d\mid n}\boldsymbol g(d)\cdot \boldsymbol \mu({n\over d})\)

当然,本人更爱使用元函数的反演法,即将式子中化简出 \([n=1]\) 项,再通过 \(\displaystyle [n=1]=\boldsymbol \varepsilon(n)=(\boldsymbol \mu*\boldsymbol I)(n)=\sum_{d\mid n}\boldsymbol \mu(n)\) 反演出结果


另一方向的莫比乌斯反演

当然,铃悬 dalao 还给出了另一个方向的莫比乌斯反演:

\(\displaystyle \boldsymbol g(n)=\sum_{n\mid m}\boldsymbol f(m)\) 反演为 \(\displaystyle \boldsymbol f(n)=\sum_{n\mid m}\boldsymbol \mu({m\over n})\boldsymbol g(m)\)

证明方法来源于 铃悬的数学小讲堂——狄利克雷卷积与莫比乌斯反演

我们定义一个运算 \(\displaystyle (\boldsymbol f\oplus\boldsymbol g)(n)=\sum_{n\mid m}\boldsymbol f({m\over n})\cdot \boldsymbol g(m)\)

很显然,根据定义 \(\displaystyle (\boldsymbol \varepsilon\oplus \boldsymbol f)(n)=\sum_{n\mid m}\boldsymbol \varepsilon({m\over n})\cdot \boldsymbol f(m)=\sum_{n\mid m,m\neq n}\boldsymbol \varepsilon({m\over n})\cdot \boldsymbol f(m)+\boldsymbol \varepsilon({n\over n})\cdot \boldsymbol f(n)=0+1\cdot \boldsymbol f(n)=\boldsymbol f(n)\)

所以我们可以知道,原式为 \(\boldsymbol g=\boldsymbol I\oplus \boldsymbol f\) ,反演式为 \(\boldsymbol f=\boldsymbol \mu\oplus \boldsymbol g\)

考虑到 \(\displaystyle (\ (\boldsymbol f*\boldsymbol g)\oplus \boldsymbol h)(n)=\sum_{n\mid m}(\boldsymbol f*\boldsymbol g)({m\over n})\cdot \boldsymbol h(m)=\sum_{n\mid m}(\sum_{d\mid {m\over n}}\boldsymbol f(d)\boldsymbol g({m\over nd})\ )\cdot \boldsymbol h(m)=\sum_{n\mid m}(\sum_{nd\mid m}\boldsymbol f(d)\boldsymbol g({m\over nd})\ )\cdot \boldsymbol h(m)\)

由于对于所有满足加和条件的 \(d\)\(\boldsymbol h(m)\) 都是固定的,所以可以将括号展开,原式 \(\displaystyle =\sum_{n\mid m}\sum_{nd\mid m}\boldsymbol f(d)\boldsymbol g({m\over nd})\cdot \boldsymbol h(m)\)

我们令 \(T=nd\) 所以 \(T\mid m\) 则可以肯定 \(n\mid m\)

但是我们还需要额外加上条件 \(n\mid T\) 即可保证符合原式的性质

因此,原式 \(\displaystyle =\sum_{n\mid T}\sum_{T\mid m}\boldsymbol f({T\over n})\cdot \boldsymbol g({m\over T})\cdot \boldsymbol h(m)=\sum_{n\mid T}\boldsymbol f({T\over n})\cdot ( \sum_{T\mid m}\boldsymbol g({m\over T})\cdot \boldsymbol h(m)\ )=\sum_{n\mid T}\boldsymbol f({T\over n})\cdot (\boldsymbol g\oplus\boldsymbol h)(T)=(\boldsymbol f\oplus(\boldsymbol g\oplus \boldsymbol h)\ )(n)\)

故我们得到 \((\boldsymbol f*\boldsymbol g)\oplus \boldsymbol h=\boldsymbol f\oplus (\boldsymbol g\oplus \boldsymbol h)\)

现在,我们可以很简单地证明上述式子的正确性了:

\(\boldsymbol f=\boldsymbol \varepsilon\oplus \boldsymbol f=(\boldsymbol \mu*\boldsymbol I)\oplus \boldsymbol f=\boldsymbol \mu\oplus(\boldsymbol I\oplus \boldsymbol f)=\boldsymbol \mu\oplus \boldsymbol g\)

所以上述式子成立


莫比乌斯反演例题

洛谷P4450 双亲数

给定 \(A,B,d\)\(\displaystyle ans=\sum_{a=1}^A\sum_{b=1}^B[gcd(a,b)=d]\)

第一题,咱们讲细一点......

我们不妨设 \(A\leq B\) ,否则我们交换这两个

考虑到 \(a\) 只有 \(d,2d,3d\cdots (A/d)\cdot d\) 时对答案有贡献, \(b\) 也是 \(d,2d,3d\cdots (B/d)\cdot d\) 时对答案有贡献

故我们直接改为枚举前面的系数,它们乘上 \(d\) 就是 \(a,b\)

\(\displaystyle ans=\sum_{a'=1}^{(A/d)}\sum_{b'=1}^{(B/d)}[gcd(a'd,b'd)=d]=\sum_{a'=1}^{(A/d)}\sum_{b'=1}^{(B/d)}[d\cdot gcd(a',b')=d]=\sum_{a'=1}^{(A/d)}\sum_{b'=1}^{(B/d)}[gcd(a',b')=1]\)

这里可以用上元函数反演 \(\displaystyle [n=1]=\boldsymbol \varepsilon(n)=(\boldsymbol \mu*\boldsymbol I)(n)=\sum_{d\mid n}\boldsymbol \mu(d)\)

因此直接代入上式得到 \(\displaystyle ans=\sum_{a=1}^{A/d}\sum_{B=1}^{B/d}\sum_{k\mid gcd(a,b)}\boldsymbol \mu(k)\)

要满足 \(k\mid gcd(a,b)\) ,即 \(k\)\(a,b\) 最大公因数的因数,因此一定为其公因数,可写为 \(k\mid a\wedge k\mid b\)

\(\displaystyle ans=\sum_{a=1}^{A/d}\sum_{b=1}^{B/d}\sum_{k\mid a\wedge k\mid b}\boldsymbol \mu(k)=\sum_{a=1}^{A/d}\sum_{b=1}^{B/d}\sum_{k=1}^{A/d}\boldsymbol \mu(k)[k\mid a\wedge k\mid b]\)

我们调换枚举顺序,先枚举 \(k\)

\(\displaystyle ans=\sum_{k=1}^{A/d}\boldsymbol \mu(k)\sum_{a=1}^{A/d}\sum_{b=1}^{B/d}[k\mid a\wedge k\mid b]\)

由于 \([k\mid a\wedge k\mid b]\) 可以理解为一个 bool ,所以它与 \([k\mid a]\cdot [k\mid b]\) 等价

再次代入得 \(\displaystyle ans=\sum_{k=1}^{A/d}\boldsymbol \mu(k)\sum_{a=1}^{A/d}\sum_{b=1}^{B/d}[k\mid a][k\mid b]=\sum_{k=1}^{A/d}\boldsymbol \mu(k)\sum_{a=1}^{A/d}[k\mid a]\sum_{b=1}^{B/d}[k\mid b]\)

我们单独考虑 \(\displaystyle \sum_{a=1}^{A/d}[k\mid a]\) 有贡献的肯定是 \(k,2k,3k\cdots (\ (A/d)/k)\cdot k\) 因此我们枚举有贡献的

\(\displaystyle \sum_{a=1}^{A/d}[k\mid a]=\sum_{a'=1}^{(A/d)/k}[ak\mid a]=\sum_{a'=1}^{A/(dk)}1=A/(dk)\)

同理处理 \(B\) 的式子后,我们得到 \(\displaystyle ans=\sum_{k=1}^{A/d}\boldsymbol \mu(k)\cdot (A/(dk)\ )\cdot (B/(dk)\ )\)

由于 \(A,B,d\) 是开头给定的,因此我们不妨直接令 \(A'=A/d,B'=B/d\) 即可得到 \(\displaystyle ans=\sum_{k=1}^{A'}\boldsymbol \mu(k)\cdot (A'/k)\cdot (B'/k)\)

我们先预处理莫比乌斯函数前缀和,再用二维整出分块搞一搞后面就可以 \(O(n+\sqrt n)\) 的时间搞出来了, \(n\)\(A,B\) 同阶

简单补充一下二维整除分块:考虑对 \(\forall i\in [l,r]\) 使得 \(\begin{cases} n/(l-1)\neq n/l=n/i=n/r\neq n/(r+1) \\\ \\ m/(l-1)\neq m/l=m/i=m/r\neq m/(r+1) \end{cases}\)

我们以已知左端点的为例,若对于 \(n\) ,可以求出一个 \(r_n\) ;对于 \(m\) ,可以求出一个 \(r_m\) ;则 \(min(r_n,r_m)\) 就是上述满足上述条件的 \(r\)

if(a>b) swap(a,b);
int ans=0;
for(int l=1,r;l<=a;l=r+1){
    r=min(a/(a/l),b/(b/l));
    ans+=(smu[r]-smu[l-1])*(a/l)*(b/l);
}

洛谷P3455 [POI2007]ZAP-Queries

与上一题大同小异,只不过改成了 \(n\) 次的查询,复杂度改为预处理 \(O(a)\) 加上算后面那一项的 \(n\)\(O(n\sqrt a)\)

由于 \(n,a\) 同阶,复杂度为 \(O(n\sqrt n)\)

由于式子都是一样的,这题就不推了,答案最后是 \(\displaystyle ans=\sum_{x=1}^{a/d}\boldsymbol\mu(d)\cdot(\ (a/d)/x\ )\cdot(\ (b/d)/x\ )\)

洛谷P2257 YY的GCD

推的过程类似,下面就没很多说明了

我们要求 \(\displaystyle ans=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)\in Prime]\)

我们改为枚举质数:(同样默认 $n\leq m $ )

\(\displaystyle ans=\sum_{p\in Prime}\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=p]=\sum_{p\in Prime}\sum_{i=1}^{n/p}\sum_{j=1}^{m/p}\sum_{d\mid i\wedge d\mid j}\boldsymbol\mu(d)\)

\(\therefore \displaystyle ans=\sum_{p\in Prime}\sum_{d=1}^{n/p}\boldsymbol\mu(d)\sum_{i=1}^{n/p}[d\mid i]\sum_{j=1}^{m/p}[d\mid j]=\sum_{p\in Prime}\sum_{d=1}^{n/p}\boldsymbol\mu(d)\cdot (\ (n/p)/d\ )\cdot (\ (m/p)/d\ )\)

由于这样枚举 \(d\) 太不优雅了,因此我们不妨令 \(T=pd\) ,由于 \(d\leq n/p\) 因此 \(T\leq n\)

\(\therefore \displaystyle ans=\sum_{p\in Prime}\sum_{T=1}^n \boldsymbol\mu({T\over p})\cdot [p\mid T] (n/T)\cdot (m/T)=\sum_{T=1}^n(n/T)\cdot (m/T)\cdot \sum_{p\in Prime}\boldsymbol \mu({T\over p})[p\mid T]=\sum_{T=1}^n(n/T)\cdot (m/T)\cdot \sum_{p\in Prime,p\mid T}\boldsymbol \mu({T\over p})\)

为了表述方便,我们记录 \(\displaystyle f(T)=\sum_{p\in Prime,p\mid T}\boldsymbol \mu({T\over p})\)

于是可以 \(\displaystyle ans=\sum_{T=1}^n(n/T)\cdot (m/T)\cdot f(T)\)

预处理好 \(f(n)\) ,剩下的就整出分块来搞一搞了

给出预处理的代码:

inline void sieve(){...}
inline void pre(){
    for(int i=1;i<=cntprime;i++){
        int p=prime[i];
        for(int j=1;j*p<=lim;j++){
            sumf[j*p]+=mu[j];
        }
    }

    for(int i=1;i<=n;i++){
        sumf[i]+=sumf[i-1];
    }
}

洛谷P2522 [HAOI2011]Problem b

\(\displaystyle ans=\sum_{i=a}^b\sum_{j=c}^d[gcd(i,j)=k]\)

考虑 \(\displaystyle S(m,n)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=k]=\sum_{d=1}^{n/k}\boldsymbol \mu(d)\cdot (\ (n/k)/d\ )\cdot (\ (m/k)/d\ )\)

求解 \(S(n,m)\) 方法见上文

另外,由二维差分可以得到 \(ans=S(b,d)-S(a-1,d)-S(b,c-1)+S(a-1,c-1)\)

posted @ 2020-03-14 12:04  JustinRochester  阅读(382)  评论(0编辑  收藏  举报