莫比乌斯反演
数论函数
定义域为正整数、陪域为复数的函数
\(\phi(x)\),欧拉函数
也写作:\(\varphi(x)\)
含义:小于等于自己的,与自己互质的数的个数
通式:\(\phi(x)=x\prod\limits_{p_i}(1-\dfrac{1}{p_i})\),其中\(p_i\)为\(x\)的质因数
特殊性质:
举个栗子证明理解一下:
\(12\)个分数
约分一下
按分母分个类
\(\mu(x)\),莫比乌斯函数
特殊性质:
\(\epsilon(x)\),元函数
\(id(x)\),单位函数
\(I(x)\),恒等函数
也记作\(1(x)=1\)
积性函数
积性函数:对于任意互质的整数\(a\)和\(b\),都有\(f(ab)=f(a)\cdot f(b)\)的函数\(f\),\(f(1)=1\)
完全积性函数:对于任意整数\(a\)和\(b\) ,都有\(f(ab)=f(a)\cdot f(b)\)的函数\(f\)
以上提到的所有函数均为积性函数,其中\(\phi,\mu\)为积性函数,\(\epsilon,id,I\)为完全积性函数
利用积性函数的性质,我们可以进行线性筛
狄利克雷卷积
定义两个数论函数的狄利克雷卷积\(\otimes(\ast)\)
若$h=f\ast g $
一定要记住这个式子
以下性质(看看就好):
- 交换律:\(f\ast g=g\ast f\)
- 结合律:\(f\ast (g\ast h)=(f\ast g)\ast h\)
- 分配律:\((f+g)\ast h=f \ast h+g\ast h\)
- \((xf)\ast g=x(f\ast g)\)
- \(\epsilon\ast f=f\)
将上述\(\phi\)和\(\mu\)的性质用卷积形式表示,就是
莫比乌斯反演
两边同时卷一个\(\mu\)
(这步转化注意使用狄利克雷卷积的性质)
用式子表示,就是
这个式子就是莫比乌斯反演
应用
(以下式子可以用莫比乌斯反演推,但是我懒)
求
先枚举\(d\),即\(\gcd\)的因数
注意到\(\left\lfloor\dfrac{n}{d}\right\rfloor\)只有\(\sqrt n\)种取值,整除分块\((O(\sqrt n))\)加上预处理\(\mu(O(n))\),可以处理多组询问
整除分块
-
在\(i\)到\(\left\lfloor\dfrac{n}{\left\lfloor\dfrac{n}{i}\right\rfloor}\right\rfloor\)这个范围内,\(\left\lfloor\dfrac{n}{i}\right\rfloor\)的值是一样的,\(i\)取到\(\left\lfloor\dfrac{n}{\left\lfloor\dfrac{n}{i}\right\rfloor}\right\rfloor+1\)时,\(\left\lfloor\dfrac{n}{i}\right\rfloor\)的值会变小
-
\(\left\lfloor\dfrac{n}{d}\right\rfloor\)只有\(\sqrt n\)种取值
利用这个就可以做整除分块了
对于这个式子\(\sum\limits_{d=1}^{\min(n,m)}\mu(d)\left\lfloor\frac{n}{d}\right\rfloor\left\lfloor\frac{m}{d}\right\rfloor\)
在\(i-\min(\left\lfloor\dfrac{n}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor,\left\lfloor\dfrac{m}{\left\lfloor\frac{m}{i}\right\rfloor}\right\rfloor)\)的范围内,\(\left\lfloor\dfrac{n}{d}\right\rfloor\left\lfloor\dfrac{m}{d}\right\rfloor\)的值不变
设 \(r=\min(\left\lfloor\dfrac{n}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor,\left\lfloor\dfrac{m}{\left\lfloor\frac{m}{i}\right\rfloor}\right\rfloor)\)
那么这一段内的和就是\(\left\lfloor\dfrac{n}{d}\right\rfloor\left\lfloor\dfrac{m}{d}\right\rfloor\cdot \sum\limits_{j=i}^{r}\mu(j)\)
对\(\mu\)求一下前缀和,即可\(O(1)\)算出\(i-r\)的和
inline long long solve(int n,int m){
long long ans=0;
for(int i=1,r;i<=min(n,m);i=r+1){
r=min(n/(n/i),m/(m/i));
ans+=1ll*(n/i)*(m/i)*(musum[r]-musum[i-1]);
}
return ans;
}