前言
(今天入坑莫比乌斯反演,感觉全都是不可做题..)
莫比乌斯反演属于数论中较难的部分吧,做这种题一般长片的推导,化简,最后用枚举或者整除分块等求出答案(我做题少只见过这些).
下面要引入一些东西做铺垫.
数论函数与积性函数
首先定义数论函数f(x)f(x):定义域和值域都是整数的函数.
定义积性函数:∀a,b,gcd(a,b)=1∀a,b,gcd(a,b)=1,f(ab)=f(a)f(b)f(ab)=f(a)f(b),称ff为积性函数
常见的积性函数有欧拉函数、莫比乌斯函数、除数函数等(这个不需要展开了解).
狄利克雷卷积
狄利克雷卷积()卷积的定义如下:
f,gf,g是两个数论函数,他们的DirichletDirichlet卷积为:
(f∗g)(n)=Σd|nf(d)g(nd)(f∗g)(n)=Σd|nf(d)g(nd)
它满足交换率,因为dd正序取遍约数时也逆序取遍约数
它也满足结合律,分配率,根据定义推一推都比较好证明.
DirichletDirichlet卷积的小性质:两个积性函数卷起来还是积性函数.
莫比乌斯函数
下面定义莫比乌斯函数μμ.
一个数nn分解成.
若存在ci>1ci>1,μ(n)=0μ(n)=0
否则μ(n)=(−1)k,kμ(n)=(−1)k,k为本质不同的质因子个数
可以使用线性筛预处理:
其中mu(i)mu(i)表示μ(i)μ(i),flagflag为素数标记,prpr为素数表
void Init(int n) {
memset(flag, 1, sizeof flag); flag[1] = false;
cnt = 0; mu[1] = 1;
for(int i = 2; i <= n; i ++) {
if(flag[i]) {
pr[++ cnt] = i;
mu[i] = -1;
}
for(int j = 1; j <= cnt && pr[j] * i <= n; j ++) {
flag[ i * pr[j] ] = false;
if(i % pr[j] == 0) {
mu[ i * pr[j] ] = 0;
break ;
}
mu[ i * pr[j] ] = - mu[i];
}
}
}
莫比乌斯函数有什么用呢?我们需要引入一个不错的结论:
先来介绍一下ee吧,
表示狄利克雷卷积的单位元,即e∗f=fe∗f=f,显然这个e(n)e(n)应该为[n==1][n==1],就是说nn为时值是11,否则值为。这不难证明,套上卷积的定义即可.
好了,介绍完了,来证明一下这个式子吧.
把nn表示成,令n′=∏ki=1pin′=∏i=1kpi,根据μμ函数的定义,指数超过11那么这个数产生的贡献为,可以直接忽略.所以∑d|nμ(d)=∑d|n′μ(d)∑d|nμ(d)=∑d|n′μ(d)。
∑d|nμ(d)=∑d|n′μ(d)=∑ki=1Cik(−1)i=[k==0]∑d|nμ(d)=∑d|n′μ(d)=∑i=1kCki(−1)i=[k==0]
有00个质因子的时候等于,其他时候等于00.与是完全相同的.就证出来了.
几个函数
ee是单位元,是f(x)=1f(x)=1的常函数,μμ是莫比乌斯函数,ϕϕ为欧拉函数,idid为f(i)=if(i)=i的函数.
他们卷起来有一些神奇的性质,下面两个性质可能比较重要,之后应该会用.
- ϕ∗1=idϕ∗1=id
- id∗μ=ϕid∗μ=ϕ
证明应该质因数分解一下就行,不会(逃
莫比乌斯反演
说了半天,终于说到了本篇博客要讲的知识,莫比乌斯反演(MobiusInversionMobiusInversion).
f(n),g(n)f(n),g(n)是两个数论函数.
如果有
那么有
即
我对莫比乌斯反演的作用的理解:
原来是用gg来表示,反演过后是用ff来表示.这个过程需要借助莫比乌斯函数,所以称莫比乌斯反演.
证明:我又不会(再逃
一种经典模型
给定f,n,mf,n,m,求 ∑ni=1∑mj=1f(gcd(i,j))∑i=1n∑j=1mf(gcd(i,j)).
TT组询问,.
解法:
不妨设n≤mn≤m,枚举d=gcd(i,j)d=gcd(i,j):
令i=i′d,j=j′di=i′d,j=j′d,枚举i′,j′i′,j′:
用ee代替 :
用之前的结论展开ee函数:
d|gcd(i′,j′)d|gcd(i′,j′)意味着d|i′d|i′并且d|j′d|j′:
变换枚举顺序,将d′d′提前:
令g(k)=∑d|kμ(k)f(kd)g(k)=∑d|kμ(k)f(kd),
枚举乘积k=dd′k=dd′,原式化为:
根据定义式O(nlogn)O(nlogn)暴力预处理出gg,再地回答每个询问,使用整除分块即可.
对于ff有特殊性质的情况,有可能可以线性筛预处理.