莫比乌斯反演
目录
莫比乌斯反演的原理
由定义,对于两个积性函数 \(\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)\)