莫比乌斯反演详解
先导知识:
数论函数
定义:数论函数指一类定义域是正整数,值域是一个数集的函数。
加法:逐项相加即可
数乘:用一个常数xxx乘f(n)=x∗f(n)f(n)=x∗f(n)f(n)=x∗f(n)
狄利克雷卷积
定义两个数论函数的狄利克雷卷积 ∗ :
若函数h=f∗gh=f∗gh=f∗g则:
h(n)=∑d∣nf(d)∗g(nd)h(n) = \sum\limits_{d|n}f(d)*g(\frac{n}{d})h(n)=d∣n∑f(d)∗g(dn)
等价于
h(n)=∑i∗j=nf(i)∗g(j)h(n) = \sum\limits_{i*j=n}f(i)*g(j)h(n)=i∗j=n∑f(i)∗g(j)
狄利克雷卷积有以下性质:
1、交换律:f∗g=g∗ff∗g=g∗ff∗g=g∗f
2、结合律:f∗(g∗h)=(f∗g)∗hf∗(g∗h)=(f∗g)∗hf∗(g∗h)=(f∗g)∗h
3、分配律:f∗h+g∗h=(f+g)∗hf∗h+g∗h=(f+g)∗hf∗h+g∗h=(f+g)∗h
4、单位元:ϵ∗f=f,其中ϵ(n)=[n==1]ϵ∗f=f,其中ϵ(n)=[n==1]ϵ∗f=f,其中ϵ(n)=[n==1]
5、逆元:对于每一个f(1)≠0的函数f,都有f∗g=ϵf∗g=ϵf∗g=ϵ
求函数逆元ϵ
g(n)=1f(1)(ϵ−∑d∣n,d≠1f(d)∗g(nd))g(n)=\frac{1}{f(1)}(ϵ-\sum\limits_{d|n,d≠1}f(d)*g(\frac{n}{d}))g(n)=f(1)1(ϵ−d∣n,d=1∑f(d)∗g(dn))
即
∑d∣nf(d)∗g(nd)=f(1)g(n)+∑d∣n,d≠1f(d)∗g(nd)=ϵ\sum\limits_{d|n}f(d)*g(\frac{n}{d})=f(1)g(n)+\sum\limits_{d|n,d≠1}f(d)*g(\frac{n}{d})=ϵd∣n∑f(d)∗g(dn)=f(1)g(n)+d∣n,d=1∑f(d)∗g(dn)=ϵ
积性函数
如果一个数论函数fff有当gcd(n,m)==1gcd(n,m)==1gcd(n,m)==1时
f(n∗m)=f(n)f(m)f(n*m)=f(n)f(m)f(n∗m)=f(n)f(m)
就称fff为积性函数。
当gcd(n,m)≠1gcd(n,m)≠1gcd(n,m)=1时,也有f(n∗m)=f(n)f(m))f(n*m)=f(n)f(m))f(n∗m)=f(n)f(m))时,fff为完全积性函数。
常见的积性函数有欧拉函数φ(n)φ(n)φ(n),莫比乌斯函数μ(n)μ(n)μ(n),因子和函数σ(n)σ(n)σ(n)等。
莫比乌斯反演
我们先看一个函数:
F(n)=∑d∣nf(d)F(n) = \sum\limits_{d|n}f(d)F(n)=d∣n∑f(d)
可以看出:
F(1)=f(1)F(1)=f(1)F(1)=f(1)
F(2)=f(1)+f(2)F(2)=f(1)+f(2)F(2)=f(1)+f(2)
F(3)=f(1)+f(3)F(3)=f(1)+f(3)F(3)=f(1)+f(3)
F(4)=f(1)+f(2)+f(4)F(4)=f(1)+f(2)+f(4)F(4)=f(1)+f(2)+f(4)
F(5)=f(1)+f(5)F(5)=f(1)+f(5)F(5)=f(1)+f(5)
F(6)=f(1)+f(2)+f(3)+f(6)F(6)=f(1)+f(2)+f(3)+f(6)F(6)=f(1)+f(2)+f(3)+f(6)
F(7)=f(1)+f(7)F(7)=f(1)+f(7)F(7)=f(1)+f(7)
F(8)=f(1)+f(2)+f(4)+f(8)F(8)=f(1)+f(2)+f(4)+f(8)F(8)=f(1)+f(2)+f(4)+f(8)
找规律可得:
f(1)=F(1)f(1)=F(1)f(1)=F(1)
f(2)=F(2)−F(1)f(2)=F(2)−F(1)f(2)=F(2)−F(1)
f(3)=F(3)−F(1)f(3)=F(3)−F(1)f(3)=F(3)−F(1)
f(4)=F(4)−F(2)f(4)=F(4)−F(2)f(4)=F(4)−F(2)
f(5)=F(5)−F(1)f(5)=F(5)−F(1)f(5)=F(5)−F(1)
f(6)=F(6)−F(3)−F(2)+F(1)f(6)=F(6)−F(3)−F(2)+F(1)f(6)=F(6)−F(3)−F(2)+F(1)
f(7)=F(7)−F(1)f(7)=F(7)−F(1)f(7)=F(7)−F(1)
f(8)=F(8)−F(4)f(8)=F(8)−F(4)f(8)=F(8)−F(4)
莫比乌斯公式
由上面的规律可以看出f(n)f(n)f(n)等于加或减去F(d),dF(d),dF(d),d为nnn的因子,而是加还是减由理解为是由莫比乌斯函数决定。
这里先给出莫比乌斯反演公式:
f(n)=∑d∣nμ(d)F(nd)f(n) = \sum\limits_{d|n}μ(d)F(\frac{n}{d})f(n)=d∣n∑μ(d)F(dn)
其他形式:
f(n)=∑n∣dμ(dn)F(d)f(n) = \sum\limits_{n|d}μ(\frac{d}{n})F(d)f(n)=n∣d∑μ(nd)F(d)
μ即为莫比乌斯函数
μ(n)={1n=1(−1)rn=p1p2p3...pr,其中pi为不同素数0其他情况μ(n)=\left\{ \begin{aligned} &1& &n=1 \\ &(-1)^r& &n=p^1p^2p^3...p^r,其中p^i为不同素数\\ & 0& &其他情况 \end{aligned} \right. μ(n)=⎩⎪⎨⎪⎧1(−1)r0n=1n=p1p2p3...pr,其中pi为不同素数其他情况
μ具有以下性质
∑d∣nμ(d)={1n=10n>1\sum\limits_{d|n}μ(d)=\left\{\begin{aligned} &1& &n=1 \\ & 0& &n>1\\ \end{aligned} \right.d∣n∑μ(d)={10n=1n>1
莫比乌斯函数与欧拉函数的联系:∑d∣nμ(d)d=φ(n)n,(id∗μ)(i)=φ(i)\sum\limits_{d|n}\frac{μ(d)}{d}=\frac{φ(n)}{n},(id∗μ)(i)=φ(i)d∣n∑dμ(d)=nφ(n),(id∗μ)(i)=φ(i)
证明上面式子只需把F(n)=n,f(n)=φ(n)F(n)=n,f(n)=φ(n)F(n)=n,f(n)=φ(n)带入莫比乌斯公式即可
下面证明莫比乌斯公式:
f(n)=∑d∣nμ(d)F(nd)=∑d∣nμ(d)∑k∣ndf(k)=∑k∣nf(k)∑d∣ndμ(d)=f(k)f(n) = \sum\limits_{d|n}μ(d)F(\frac{n}{d})=\sum\limits_{d|n}μ(d)\sum\limits_{k|\frac{n}{d}}f(k)=\sum\limits_{k|n}f(k)\sum\limits_{d|\frac{n}{d}}μ(d)=f(k)f(n)=d∣n∑μ(d)F(dn)=d∣n∑μ(d)k∣dn∑f(k)=k∣n∑f(k)d∣dn∑μ(d)=f(k)
这里运用了这条性质∑d∣nμ(d)={1n=10n>1\sum\limits_{d|n}μ(d)=\left\{\begin{aligned} &1& &n=1 \\ & 0& &n>1\\ \end{aligned} \right.d∣n∑μ(d)={10n=1n>1
当n=1n=1n=1时∑d∣nμ(d)\sum\limits_{d|n}μ(d)d∣n∑μ(d)为 111,其他情况均为 000。所以只有nd\frac{n}{d}dn为111时即 n=dn=dn=d 时∑d∣nμ(d)≠0\sum\limits_{d|n}μ(d)≠0d∣n∑μ(d)=0。
莫比乌斯函数求法
莫比乌斯函数是积性函数,所以我们可以用线性筛o(n)o(n)o(n)求出莫比乌斯函数
int mu[maxx],vis[maxx],prime[maxx]; void slove() {mu[1] = 1; cnt = 0;for(int i=2; i<=n; i++){if(!vis[i]){prime[cnt++] = i;mu[i] = -1;}for(int j=0; j<cnt&&i*prime[j]<=n; j++){vis[i*prime[j]] = 1;if(i%prime[j]==0) {mu[i*prime[j]] = 0;break;}mu[i*prime[j]] = -mu[i];}} }莫比乌斯反演简单应用
求下面函数
∑i=1n∑j=1mgcd(i,j)\sum\limits_{i=1}^n\sum\limits_{j=1}^mgcd(i,j)i=1∑nj=1∑mgcd(i,j) 其中 n<1e7,m<1e7n<1e7,m<1e7n<1e7,m<1e7
上面的式子可以化为
如果n>mn>mn>m 交换n,mn,mn,m。
∑d=1n∑i=1n∑j=1md[gcd(i,j)==d]\sum\limits_{d=1}^n\sum\limits_{i=1}^n\sum\limits_{j=1}^md[gcd(i,j)==d]d=1∑ni=1∑nj=1∑md[gcd(i,j)==d]
∑d=1nd∑i=1⌊nd⌋∑j=1⌊md⌋[gcd(i,j)==1]\sum\limits_{d=1}^nd\sum\limits_{i=1}^{\lfloor\frac{n} {d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}[gcd(i,j)==1]d=1∑ndi=1∑⌊dn⌋j=1∑⌊dm⌋[gcd(i,j)==1]
设 x=⌊nd⌋,y=⌊md⌋x={\lfloor\frac{n}{d}\rfloor},y={\lfloor\frac{m}{d}\rfloor}x=⌊dn⌋,y=⌊dm⌋
∑d=1nd∑i=1x∑j=1y[gcd(i,j)==1]\sum\limits_{d=1}^nd\sum\limits_{i=1}^x\sum\limits_{j=1}^y[gcd(i,j)==1]d=1∑ndi=1∑xj=1∑y[gcd(i,j)==1]
设:
f(x)=∑i=1x∑j=1y[gcd(i,j)==x]f(x)=\sum\limits_{i=1}^x\sum\limits_{j=1}^y[gcd(i,j)==x]f(x)=i=1∑xj=1∑y[gcd(i,j)==x]
F(x)=∑x∣df(d)F(x)=\sum\limits_{x|d}f(d)F(x)=x∣d∑f(d)
所以根据莫比乌斯公式的第二种形式:
f(1)=∑1∣dμ(d1)F(d)f(1)=\sum\limits_{1|d}\mu(\frac{d}{1})F(d)f(1)=1∣d∑μ(1d)F(d)
f(1)=∑d=1nμ(d)F(d)f(1)=\sum\limits_{d=1}^n\mu(d)F(d)f(1)=d=1∑nμ(d)F(d)
F(x)=∑x∣d∑i=1n∑j=1m[gcd(i,j)==d]F(x)=\sum\limits_{x|d}\sum\limits_{i=1}^n\sum\limits_{j=1}^m[gcd(i,j)==d]F(x)=x∣d∑i=1∑nj=1∑m[gcd(i,j)==d]
即:
F(x)=∑i=1n∑j=1m[x∣gcd(i,j)]F(x)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m[x|gcd(i,j)]F(x)=i=1∑nj=1∑m[x∣gcd(i,j)]
F(x)=∑i=1⌊nx⌋∑j=1⌊mx⌋[1∣gcd(i,j)]F(x)=\sum\limits_{i=1}^{\lfloor\frac{n} {x}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m} {x}\rfloor}[1|gcd(i,j)]F(x)=i=1∑⌊xn⌋j=1∑⌊xm⌋[1∣gcd(i,j)]
F(x)=⌊nx⌋⌊mx⌋F(x)={\lfloor\frac{n} {x}\rfloor}{\lfloor\frac{m} {x}\rfloor}F(x)=⌊xn⌋⌊xm⌋
所以
f(1)=∑i=1x∑j=1y[gcd(i,j)==1]=∑d=1nμ(d)⌊xd⌋⌊yd⌋f(1)=\sum\limits_{i=1}^x\sum\limits_{j=1}^y[gcd(i,j)==1]=\sum\limits_{d=1}^n\mu(d){\lfloor\frac{x} {d}\rfloor}{\lfloor\frac{y} {d}\rfloor}f(1)=i=1∑xj=1∑y[gcd(i,j)==1]=d=1∑nμ(d)⌊dx⌋⌊dy⌋
把f(1)f(1)f(1)带入∑d=1nd∑i=1x∑j=1y[gcd(i,j)==1]\sum\limits_{d=1}^nd\sum\limits_{i=1}^x\sum\limits_{j=1}^y[gcd(i,j)==1]d=1∑ndi=1∑xj=1∑y[gcd(i,j)==1]可得
∑d=1nd∑i=1x∑j=1y[gcd(i,j)==1]=∑d=1nd∑i=1xμ(i)⌊xi⌋⌊yi⌋\sum\limits_{d=1}^nd\sum\limits_{i=1}^x\sum\limits_{j=1}^y[gcd(i,j)==1]=\sum\limits_{d=1}^nd\sum\limits_{i=1}^x\mu(i){\lfloor\frac{x} {i}\rfloor}{\lfloor\frac{y} {i}\rfloor}d=1∑ndi=1∑xj=1∑y[gcd(i,j)==1]=d=1∑ndi=1∑xμ(i)⌊ix⌋⌊iy⌋
上式可以写为:
∑d=1n∑i=1xdμ(i)⌊xi⌋⌊yi⌋\sum\limits_{d=1}^n\sum\limits_{i=1}^xd\mu(i){\lfloor\frac{x} {i}\rfloor}{\lfloor\frac{y} {i}\rfloor}d=1∑ni=1∑xdμ(i)⌊ix⌋⌊iy⌋
代入x=nd,y=mdx=\frac{n}{d},y=\frac{m}{d}x=dn,y=dm
∑d=1n∑i=1nddμ(i)⌊nid⌋⌊mid⌋\sum\limits_{d=1}^n\sum\limits_{i=1}^{\frac{n}{d}}d\mu(i){\lfloor\frac{n} {id}\rfloor}{\lfloor\frac{m} {id}\rfloor}d=1∑ni=1∑dndμ(i)⌊idn⌋⌊idm⌋
设D=idD=idD=id带入可得
∑D=1n∑d∣Ddμ(Dd)⌊nD⌋⌊mD⌋\sum\limits_{D=1}^n\sum\limits_{d|D}d\mu(\frac{D}{d}){\lfloor\frac{n} {D}\rfloor}{\lfloor\frac{m} {D}\rfloor}D=1∑nd∣D∑dμ(dD)⌊Dn⌋⌊Dm⌋
∑D=1n⌊nD⌋⌊mD⌋∑d∣Ddμ(Dd)\sum\limits_{D=1}^n{\lfloor\frac{n} {D}\rfloor}{\lfloor\frac{m} {D}\rfloor}\sum\limits_{d|D}d\mu(\frac{D}{d})D=1∑n⌊Dn⌋⌊Dm⌋d∣D∑dμ(dD)
设∑d∣Ddμ(Dd)\sum\limits_{d|D}d\mu(\frac{D}{d})d∣D∑dμ(dD)为f(D)f(D)f(D)
原式为:
∑D=1n⌊nD⌋⌊mD⌋f(D)\sum\limits_{D=1}^n{\lfloor\frac{n} {D}\rfloor}{\lfloor\frac{m} {D}\rfloor}f(D)D=1∑n⌊Dn⌋⌊Dm⌋f(D)
如果可以计算出f(D)f(D)f(D)就可以通过除法分块解出此题了
接下来我们来讨论f(D)f(D)f(D)
线性筛筛积性函数
显然f(D)f(D)f(D)是一个积性函数。
D=∏i=1rPiai(P为质数)D=\prod_{i=1}^rP_i^{a_i}(P为质数)D=∏i=1rPiai(P为质数),显然:
f(D)=∏i=1tf(Piai)f(D)=\prod_{i=1}^tf(P_i^{a_i})f(D)=∏i=1tf(Piai)
f(Piai)f(P_i^{a_i})f(Piai)可以展开为:
f(Piai)=∑d∣Piaidμ(Dd)=1×μ(Piai)+Pi×μ(Piai−1)+...+Piai×μ(1)f(P_i^{a_i})=\sum_{d|P_i^{a_i}}d\mu(\frac Dd)=1\times\mu(P_i^{a_i})+P_i\times\mu(P_i^{a_i-1})+...+P_i^{a_i}\times\mu(1)f(Piai)=∑d∣Piaidμ(dD)=1×μ(Piai)+Pi×μ(Piai−1)+...+Piai×μ(1)
根据μ的定义可知,μ(Piai),μ(Piai−1),...,μ(Pi2)\mu(P_i^{a_i}),\mu(P_i^{a_i-1}),...,\mu(P_i^2)μ(Piai),μ(Piai−1),...,μ(Pi2)都等于0,也就是说,我们只需要考虑这个式子的最后两项。即:
f(Piai)=Pi(ai−1)×μ(Pi)+Piai×μ(1)=−Pi(ai−1)+Piai=Pi(ai−1)(Pi−1)f(P_i^{a_i})=P_i^{(a_i-1)}\times\mu(P_i)+P_i^{a_i}\times\mu(1)=-P_i^{(a_i-1)}+P_i^{a_i}=P_i^{(a_i-1)}(P_i-1)f(Piai)=Pi(ai−1)×μ(Pi)+Piai×μ(1)=−Pi(ai−1)+Piai=Pi(ai−1)(Pi−1)
所以:
f(D)=∏i=1rPi(ai−1)(Pi−1)f(D)=\prod_{i=1}^rP_i^{(a_i-1)}(P_i-1)f(D)=∏i=1rPi(ai−1)(Pi−1)
考虑线性筛筛法
f(D)={1(D=1)p−1(Disprime)f(D)=\begin{cases}1&(D=1)\\p-1&(D\ is\ prime)\end{cases}f(D)={1p−1(D=1)(D is prime)
筛的过程中
f(i×Pj)={f(i)×f(Pj)(Pj∤i)f(i)×Pi(Pj∣i)f(i\times P_j)=\begin{cases}f(i)\times f(P_j)&(P_j\not{|}i)\\f(i)\times P_i&(P_j|i)\end{cases}f(i×Pj)={f(i)×f(Pj)f(i)×Pi(Pj∣i)(Pj∣i)
此时可以用线性筛就算出f(D)f(D)f(D)了。
#include <bits/stdc++.h>using namespace std; typedef long long ll; const int maxx=1e7+7,mod=1e9+7; ll prime[maxx],f[maxx]; bool vis[maxx]; void sieve(int n)//线性筛计算f函数值 {vis[1]=1;f[1]=1;for(ll i=2;i<=n;i++){if(!vis[i]) {prime[++prime[0]]=i;f[i]=(i-1)%mod;}for(ll j=1;j<=prime[0]&&prime[j]*i<=n;j++){vis[i*prime[j]]=1;if(i%prime[j])f[i*prime[j]]=(f[i]*f[prime[j]])%mod;else{f[i*prime[j]]=(f[i]*prime[j])%mod;break;}}} } int main() {ll n,m;sieve(10000000);while(cin>>n>>m){if(n>m) swap(n,m);ll ans=0;for(int i=1;i<=n;i++){ans=(ans+(((n/i)*(m/i))%mod*f[i])%mod)%mod;}cout<<ans<<endl;} }