- admin 的博客
莫比乌斯反演与数论函数
- @ 2026-7-9 14:53:05
莫比乌斯反演与数论函数 更新于 2026/7/9 10:52:15 作者
command_block
本博客的第一篇博文哦!纪念。
---- 莫比乌斯反演,本质是利用莫比乌斯函数与其他函数间卷积关系,对函数做一系列简化,从而更高效的解决问题。
---- 数论函数,更广阔的天地,因为
0.写在前面
这里面式子可能比较多,大家多看看证明,尤其是关键证明以及题目推导过程,硬记下的结论越少,越不容易忘记。
(看不清式子可以放大网页)
由于写的时候匆忙,公式可能有错误,请私信或者在下方评论。
每个新东西提出后都会做题或者证明,权当熟悉。
不是一个下午就能看懂的,千万不要直接弃疗
- 给大家简要介绍一下符号的意思。
有时候以简写。
表示下取整,比如
表示 : 如果为真,则值为1,否则为0.(就像if里面的东西)
比如
表示是的因数,注意,前面是后面的因数。
比如
称为和式,意思是对……求和。
比如说,表示枚举变量 ,对 求和。
等价于:
int ans=0;
for (int i=1;i<=n;i++)
ans+=i;
我们常把上界写在上面,下界写在下面,如
有 (枚举的因数)
1.狄利克雷卷积与数论函数
——介绍了狄利克雷卷积,数论函数(积性函数)的综合
数论函数,就是值域为整数(陪域为复数,但这不重要)的函数。
也就是说下面出现的数没有特殊说明的话,都是整数。
两个数论函数的狄利克雷卷积是一个新函数。
比如两个函数的狄利克雷卷积写作 (相当于函数名称)。
什么意思呢?
换句话说就是
(不过一般不这样写,因为不方便化式子。)
比如说计算
可得
(对于某个新东西,能做到的话,理解的最好方式就是手动模拟)
狄利克雷卷积满足以下运算规律(显而易见,不证):
交换律——;
结合律——;
(狄利克雷卷积是一个对称的结构)
下面的推导都基于狄利克雷卷积,有必要好好理解。
介绍几个简单的数论函数,让你有个基本概念。
无论是啥,它永远等于1,所以叫做废柴恒等函数
(也作) 当n=1时,函数值为1,否则为0。被称作元函数因为它是卷积的单位元()。(Important)
被称作单位函数
附: 被称作幂函数(是的特殊情况)
是完全积性函数。
完全积性函数: 对于任意的整数a和b有
附上两个后面会讲的稍微复杂的例子:
小于n的整数中,与n互质的数的个数,称作欧拉函数($\varphi(n)$)。
称作莫比乌斯函数($\mu(n)$)。
和函数是积性函数(我们后面会证明)。
积性函数: 对于一个函数 , 如果时有,则该函数是积性函数。
积性函数有许多优良性质哦,这些重要的性质我们后面会讲。
很明显,完全积性函数∈积性函数。
下面是一些性质:
- 对于一个积性函数,有
根据(定义)可得。
- 对于函数,积性
这里的是指的个素因子,也就是把分解的结果。
则是对应的次数。
(比方说1800的分解结果就是)
因为都互质,根据积性易证。
用处:形如的函数值是比较好分析的,我们在利用这个性质来分析一般的情况,后面你们会见到例子。
- 两个积性函数的卷积还是积性函数。
(初学者可以先跳过证明)
设两个积性函数。
它们的狄利克雷卷积是
设两数互质。
$=\sum\limits_{d|a}F_1(d)F_2(a/d)*\sum\limits_{t|b}F_1(t)F_2(b/t)$
$=\sum\limits_{d|a}\sum\limits_{t|b}F_1(d)F_2(a/d)F_1(t)F_2(b/t)$
把合并(根据约数集合的合并),由于与互质,所以与互质。
(根据积性可以把化为,类似)
,得证.
- 积性函数的逆也是积性函数
(初学者可以先跳过证明)
来介绍一下函数在狄利克雷卷积意义下的逆。
满足时,和互逆。
(类比同余逆元理解)
附:函数的逆可以通过某种方式构造出来:构造方法(然并卵)
考虑数学归纳法(跟构造方法有点像)
设,且是积性函数。
我们要证明对于任意的的,都满足
因为
-
- a或b为1
当时,
由于积性,根据上文,得
所以当或时,结论显然成立。
-
- ab>1
我们考虑已证明了所有的时,结论成立。
$G(ab)=\sum\limits_{d|ab}F(d)G(ab/d)-\sum\limits_{d|ab,d≠1}F(d)G(ab/d)$
由,得,由于所以。
根据所有的时,积性成立得
下面拆分求和号(乘法分配律),这一步有点难。
$=-\sum\limits_{i|a}F(i)G(a/i)\sum\limits_{j|b,ij≠1}F(j)G(b/j)$
要求,即排除的情况。
$=F(1)F(1)G(a)G(b)-\sum\limits_{i|a}F(i)G(a/i)\sum\limits_{j|b}F(j)G(b/j)$
由,得$\sum\limits_{i|a}F(i)G(a/i)\sum\limits_{j|b}F(j)G(b/j)=e(a)e(b)=0$得
由于积性,根据上文,得
,得证.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
2.莫反公式的推导:
——推导了函数,莫比乌斯反演定理
有两个单变量函数 F 与 f 。
设函数 F 与 f 有如下关系:
理解了上述狄利克雷卷积的定义后,不难发现。
(废话)
(F函数是元函数和f函数的卷积)
现在如果函数易求,那我们可以按照上式算出。
问题在于,如果即函数易求,如何求出?
,两边同时乘以得
我们只要想办法求出就好了。
大佬Möbius把命名为
问题在于这个函数里面是什么呢?
是个积性函数,因为积性函数的逆还是积性函数。
这里有个小技巧,研究一个积性函数,先研究其在质数的幂时的表现。
比如说(p是质数)。
k=0时,显然有
k=1时,由于
注意到p为素数,得到
因为得,即
k>1时,由于
注意到p为素数,得到$I(p^k)\mu(1)+I(p^{k-1})\mu(p)+...+I(1)\mu(p^k)=e(p^k)=0$
所有的都为1,得到
代入得到
考虑上式k=2的情况,得到
考虑上式k=3的情况,得到也就是
……,得到k=任意更大的数时
利用数学归纳法,证明了k>1时,。
大家缓口气哦,函数的终极定义马上就证明出来了。
由于上文积性函数性质2: $\mu(n=p_1^{k_1}p_2^{k_2}...p_m^{k_m})=\mu(p_1^{k_1})\mu(p_2^{k_2})...\mu(p_m^{k_m})$
因为k>1时,
可以想象到当某一个时,
不然的话所有的k=1。
可以想象到
mu 函数的浮出水面。

现在来介绍莫比乌斯函数是怎么用来反演的。
-
反演公式:
-
嵌入式莫比乌斯反演:
由得
注意到
则有
初学者可以只掌握这一种。
-
约数的莫比乌斯反演:
若:
则:
又作(和上面那个式子等价)
根据有。
如果你们喜欢和式的话:证明2
-
倍数的莫比乌斯反演:
若:
则:
(这个比较特殊,并不是狄利克雷卷积的形式)
又作与
将的定义代入。
第一个求和号对k没有限制,我们交换求和号,考虑枚举t,看有什么对应的k:
$=∑\limits_{t}f(t)\sum\limits_{nk|t}\mu(k)=∑\limits_{t}f(t)\sum\limits_{k|(t/n),n|t}\mu(k)$
根据嵌入式反演能得到
,证毕。
-
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
3.知识储备:
- 分解质因数求法,单个mu(n)
直接按照定义,分解因数暴力求。
代码被和谐
//Time:O(sqrt(n))
- 线性筛法,mu(1~n) (正宗)
利用函数的积性性质。
想深入学习线性筛法的看这里。
#include<iostream>
#include<cstring>
#define MaxNum 10000100
using namespace std;
bool e[MaxNum];
int p[MaxNum],tn,mu[MaxNum],n;
void Mobius()
{
e[1]=1;mu[1]=1;
for (int i=2;i<=n;i++){
if (!e[i]){p[++tn]=i;mu[i]=-1;}
for (int j=1;j<=tn;j++){
if (p[j]*i>n)break;
mu[p[j]*i]=i%p[j]==0 ? 0 : -mu[i];
e[p[j]*i]=1;
if (i%p[j]==0)break;
}
}
}
int main()
{
cin>>n;
Mobius();
for(int i=1;i<=n;++i)
printf("%d: %d\n",i,mu[i]);
return 0;
}//Time:O(n)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
4.第一道题:整除分块
(除了特殊说明,除法均为整除)
讲了那么多,那么问题来了:我们问什么要学莫比乌斯反演?这有什么用呢?
来看一道题目。
让你求$\large{\sum\limits_{i=1}^{n}\sum\limits_{j=1}^m[gcd(i,j)=1]}$,也就是互质数对数。()
大力两重循环+欧几里得?
悄悄告诉你,正解!
$ANS=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^m[(i,j)=1]$。
用嵌入式反演替换 :
-
数对满足的充要条件是且。
即, 人话就是 : 即是的约数又是的约数的数是的公约数。
则有,这比较重要。
$ANS=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^m\sum\limits_{d|i,d|j}\mu(d)$
我们考虑交换求和顺序,分别查看每个变量的限制。
最先枚举,考虑其范围,显然在以内。
必须要满足,且在以内。
必须要满足,且在以内。
$ANS=\sum\limits_{d=1}^n\mu(d)\sum\limits_{d|i}^{n}\sum\limits_{d|j}^m1$
观察后面的$\sum\limits_{d|i}^{n}\sum\limits_{d|j}^m1=(\sum\limits_{d|i}^{n}1)(\sum\limits_{d|j}^m1)$
而相当于以内的倍数的个数,显然为
就得到$ANS=\sum\limits_{d=1}^n\mu(d)\lfloor n/d\rfloor\lfloor m/d\rfloor$
这样子就可以计算了。
怎么做到呢?需要一个叫做整除分块的技巧。
好的,下面我们默认你会整除分块了。
回顾上面的问题,我们已经变形到了$ANS=∑\limits_{d=1}^{min(n,m)}μ(d)\lfloor n/d\rfloor \lfloor m/d\rfloor$
看到和式后面的,是可以整除分块的。
问题是还乘了个,根据套路弄个前缀和搞定。
(如果这句听不懂,把入门小记再看一遍)
即的和乘上。
Code:
#include<iostream>
#define MaxNum 100100
using namespace std;
int p[MaxNum/8],tn,mu[MaxNum],n,m;
bool e[MaxNum];
long long calc(int n,int m)
{
long long ans=0;
for (int l=1,r=0;l<=min(n,m);l=r+1){
r=min(n/(n/l),m/(m/l));// 分段
ans+=1ll*(mu[r]-mu[l-1])*(n/l)*(m/l);
}return ans;
}
int main()
{
e[1]=1;mu[1]=1;
for (int i=2;i<=MaxNum;i++){
if (!e[i]){p[++tn]=i;mu[i]=-1;}
for (int j=1;j<=tn;j++){
if (p[j]*i>MaxNum)break;
mu[p[j]*i]=i%p[j]==0 ? 0 : -mu[i];
e[p[j]*i]=1;
if (i%p[j]==0)break;
}
}for (int i=2;i<=MaxNum;i++)mu[i]+=mu[i-1];
//筛法弄出mu前缀和,参看前文
cin>>n>>m;
cout<<calc(n,m)<<endl;
return 0;
}
后面你会看到,莫比乌斯反演不分块复杂度就是一堆垃圾。
分块是肯定要分块的,这辈子都要分块的
恭喜你,已经在莫比乌斯反演的路上迈出了第一步!
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
5.技巧进阶:莫反常用结论以及练习
莫比乌斯反演是极具技巧性的。
主要的思维难度就建立在反演和分块两部分。
看题吧。
第一题P2568 GCD
求$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[(i,j)=prime]$
在上一题中,我们解决了求的问题,而且我们已经能够做到求解了。
我们尝试求
- 注意到,蕴含且.
-
既然都是的倍数,我们不妨把都除以
此时,后面原有的需要还原成,原有的要还原成
$=\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{n/d}[(id,jd)=d]$
$=\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{n/d}[(i,j)=1]$,又回到了我们熟悉的问题!
求解的复杂度是
对于每个素数求解的复杂度是$O\Big(\sum\limits_{p\in Prime}^{n}{\sqrt{n/p}}\Big)$
将素数视为平均分布,可估计额
接下来需要一点微积分知识 :
总的复杂度就是
对于不会计算复杂度的同学,可以暴力统计一下式子的值,看看能不能过就好了。
Code:
#include<iostream>
#include<cstdio>
#define MaxNum 10000010
using namespace std;
long long p[MaxNum/10],tn,mu[MaxNum+50],anss,ttn,n,aaa;
bool e[MaxNum+50];
void getmu()
{
e[1]=1;mu[1]=1;
for (long long i=2;i<=MaxNum;i++){
if (!e[i])mu[p[++tn]=i]=-1;
for (int j=1;j<=tn&&i*p[j]<MaxNum;j++){
e[i*p[j]]=1;
mu[i*p[j]]=i%p[j]? -mu[i] : 0;
if (!i%p[j])break;
}
}
}
//sum(1,N/n)sum(1,N/n)[gcd(i,j)==1]
long long gg(int n){
long long ans=0;
for (int l=1,r=0;l<=n;l=r+1){
r=n/(n/l); // 分段
ans+=1ll*(mu[r]-mu[l-1])*(n/l)*(n/l);
}return ans;
}
int main()
{
getmu();
for (int i=2;i<=MaxNum;i++)mu[i]+=mu[i-1];
cin>>n;
long long ans=0;
for (int i=2;i<=n;i++)
if(!e[i])ans+=gg(n/i);
cout<<ans;
return 0;
}
貌似和上一题相同呢?发现。
上一题的还要乘上数据组数,肯定是跑不过去的。
我们将上面的最终式子整理:
$\sum\limits_{p∈Prime}^{n}f(p)=\sum\limits_{p∈Prime}^{n}∑\limits_{d=1}^{m/p}μ(d)\lfloor n/dp\rfloor\lfloor m/dp\rfloor$
现在又有个蛇皮操作叫改变枚举变量
说起,我就想起……开机……弘扬中华文化。
还是把换一下吧,就令我们枚举k。容易发现
明显的,和都是k的约数,我们再枚举,得到。(把枚举k的和式放在最前面)
$\sum\limits_{k=1}^{min(n,m)}∑\limits_{p∈prime,p|k}μ(k/p)\lfloor n/k\rfloor\lfloor m/k\rfloor$
我们发现只有一项和有关,所以我们可以把连着一起放到最后面。
得到$\sum\limits_{k=1}^{min(n,m)}\lfloor n/k\rfloor\lfloor m/k\rfloor∑\limits_{p∈prime,p|k}μ(k/p)$
前面的$\sum\limits_{k=1}^{min(n,m)}\lfloor n/k\rfloor\lfloor m/k\rfloor$就可以整除分块了。
至于后面的还是套路,维护一个有关于的前缀和。
怎么弄出前缀和,就是考验数论口胡基本功的时候啦,这里也介绍一下。
设
先线筛出,然后枚举,对于 的将。(贡献模式,好好理解)
这样的话对于一个素数,复杂度为
复杂度和埃氏筛相同,为
每个询问,总的复杂度
亮出代码:
#include<algorithm>
#include<cstdio>
using namespace std;
int t,n,m,tn,p[1000500],mu[10000500],g[10000500];
bool e[10000500];
void getmu()
{
e[1]=1;mu[1]=1;
for (int i=2;i<=10000100;i++){
if (!e[i]){
p[++tn]=i;
mu[i]=-1;
}for (int j=1;j<=tn;j++){
if (1ll*i*p[j]>10000100)break;
e[i*p[j]]=1;
mu[i*p[j]]=i%p[j] ? -mu[i] : 0;
if (!i%p[j])break;
}
}//线筛出mu
}
long long calc(int n,int m)
{
long long ans=0;
int l=1,r;
for (;l<=min(n,m);l=r+1){
r=min(n/(n/l),m/(m/l));//整除分块
ans+=1ll*(n/l)*(m/l)*(g[r]-g[l-1]);
}return ans;
}
int main()
{
scanf("%d",&t);
getmu();
for (int i=1;i<=tn;i++)
for (int j=p[i];j<=10000100;j+=p[i])
g[j]+=mu[j/p[i]];
for (int i=2;i<=10000100;i++)g[i]+=g[i-1];
//预处理前缀和
while(t--){
scanf("%d%d",&n,&m);
printf("%lld\n",calc(n,m));
}return 0;}
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
6.探索新知:其他数论函数
想必经过上面的学习,大家对已经有了一定的了解,运用反演定理也更熟练了些,那么我们一起向数论函数这个广阔的天地进发吧!
常用数论函数表:
| 函数名称 | 符号 | 定义 | 积性 | 卷积 |
|---|---|---|---|---|
| 恒等函数 | | | | 永远等于1 | | 完全积性函数 | | |
| 元函数 | | (也作) | | 当n为1时,函数值为1,否则为0 | | ||
| 单位函数 | | | | 函数值为n | | ||
| 幂函数 | | | | 函数值为 | | ||
| 莫比乌斯函数 | | \mu | |
| | 积性函数 | | |
| 欧拉函数| | \varphi | |
小于等于n的数中,与n互质的数的个数 | | ||
| 约数个数函数 | | (也作) | | n的约数个数 | | ||
| 约数和函数 | | | | n的约数和 | | ||
| 除数函数 | | | | n的约数k次方和 | |
1) 欧拉函数
欧拉函数,,其值为“小于等于n的数中,与n互质的数的个数”。
这个函数是可以辅助解(理解)很多的数论题的,它的地位差不多和一样重要。
而且,和之间有某些神秘联系,这一点要等我们先讲完狄利克雷卷积的一些玩法先。
先讲解这个的基本操作:
首先是积性函数。
因为
设,
得$\varphi(n)\varphi(m)=\sum\limits_{i=1}^n[(n,i)=1]\sum\limits_{j=1}^m[(m,j)=1]$
即$\sum\limits_{i=1}^n\sum\limits_{j=1}^m[(m,j)=1\ {\bf and}\ (n,i)=1]$
由于互质,等价于。
因为,且
我们还要证明所有的恰好组成的集合。
首先,这些二元组的大小为,和目标集合大小相同,我们只需要证明这些元素两两不同即可。
前置芝士 : 且,则有. (可见同余系基本定理1)
-
采用反证法,假如有
我们将两边对取模得到,由引理得,同理有,矛盾。
那么的集合与的集合一一对应,且贡献模式相同。
于是上式等价于
如何求积性函数的前n个值呢?
线性筛!
对于线性筛,我们要解决类的函数值。(下面的均为素数)
,这是很明显的:小于的数都与互质。
很明显以内的数与互质的充要条件是:它们没有公因数。
那么把所有含有因数的数去掉,剩下个。
在实用中这个定理有另外一个形式:
如果,则
设,那么$\varphi(n)=\varphi(m)*\varphi(p^k)=\varphi(m)*(p-1)p^{(k-1)}$
则,那么$\varphi(np)=\varphi(m)*\varphi(p^{(k+1)})=\varphi(m)*(p-1)p^k$
原命题明显成立。
Code:
bitset<MaxN> e;
int p[MaxN/10],tn;
long long ans,phi[MaxN];
void getphi()
{
phi[1]=1;
for (int i=2;i<=n;i++){
if (!e[i]){
p[++tn]=i;
phi[i]=i-1;
}for (int j=1,t;j<=tn&&(t=i*p[j])<=n;j++){
e[t]=1;
phi[t]=phi[i]*(i%p[j]?p[j]-1:p[j]);
//此处注意
if (i%p[j]==0)break;
}
}
}
-
代码里"此处注意":
如果,则
如果,根据上文的定理,
-
附: 有些时候我们需要求出单个的,如果按照定义大力求,至少得次。
我们把分解得
那么$\varphi(n)=\varphi(p_1^{k_1})*\varphi(p_2^{k_2})*...*\varphi(p_m^{k_m})=\dfrac{(p_1-1)p_1^k}{p_1}*\dfrac{(p_2-1)p_2^k}{p_2}*...\dfrac{(p_m-1)p_m^k}{p_m}$
$=(p_1^kp_2^{k_2}...p_m^{k_m})*\left(\dfrac{p_1-1}{p_1}*\dfrac{p_2-1}{p_2}*...*\dfrac{p_m-1}{p_m}\right)=n\left(\dfrac{p_1-1}{p_1}*\dfrac{p_2-1}{p_2}*...*\dfrac{p_m-1}{p_m}\right)$
$\varphi(n=p_1^kp_2^{k_2}...p_m^{k_m})=n\left(\dfrac{p_1-1}{p_1}*\dfrac{p_2-1}{p_2}*...*\dfrac{p_m-1}{p_m}\right)$
根据上式,把质因数分解即可求出,复杂度
Code:
int phi(int n)
{
int ans=n;
for (int i=2;i*i<=n;i++)
if (n%i==0){
ans=ans/i*(i-1);
//根据上文式子计算
while(n%i==0)n/=i;
}
if (n>1)ans=ans/n*(n-1);
//如果分解不尽,那么肯定还剩一个素数
return ans;
}
我们来看看的经典应用:
相信你能直接想到一个莫比乌斯反演的做法:
-
设是
考虑枚举gcd那么答案是$\sum\limits_{d=1}^nd\sum\limits_{i=1}^n\sum\limits_{j=1}^n[(i,j)=d]$
后面的$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[(i,j)=d]=\sum\limits_{i=1}^{(n/d)}\sum\limits_{j=1}^{(n/d)}[(i,j)=1]=f(n/d)$
答案化为。
对反演,……即为,用整除分块求一次时间复杂度
按计算即可。
考虑对的整除分块,即可(方法参照上文,证明需用积分)。
其实利用可以很方便地解决上述问题,复杂度是。
设是
我们知道的定义是:小于等于n的数中,与n互质的数的个数。
我们把加起来,则可以得到每个数与自己更小的数互质的次数和。
即$\sum\limits_{i=1}^n\sum\limits_{j=1}^i[(i,j)=1]=\sum\limits_{i=1}^n\varphi(i)$
现在,每个数只能统计比自己小的互质产生贡献,也就是,只统计了数对中的部分。
我们考虑中的部分贡献,显然和上式相同。
(想像一个邻接矩阵)
乘以就好了,但是由于会多算一次,所以答案减1。
得到$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[(i,j)=1]=2\left(\sum\limits_{i=1}^n\varphi(i)\right)-1$
我们设(前缀和),上式变为
答案变为$\sum\limits_{d=1}^nd*f(n/d)=\sum\limits_{d=1}^nd*(2*S(n/d)-1)$已经可以做到了,再整除分快一次就可以了。
然后使用线性筛就得到的算法了。
Code:
#include<cstdio>
#include<bitset>
#define MaxN 10000500
using namespace std;
int n;
bitset<MaxN> e;
int p[MaxN/10],tn;
long long ans,phi[MaxN];
void getphi()
{
phi[1]=1;
for (int i=2;i<=n;i++){
if (!e[i]){
p[++tn]=i;
phi[i]=i-1;
}for (int j=1,t;j<=tn&&(t=i*p[j])<=n;j++){
e[t]=1;
phi[t]=phi[i]*(i%p[j]?p[j]-1:p[j]);
if (i%p[j]==0)break;
}
}
}
int main()
{
scanf("%d",&n);
getphi();
for (int i=1;i<=n;i++)phi[i]+=phi[i-1];
for (int i=1;i<=n;i++)ans+=(phi[n/i]*2-1)*i;
printf("%lld",ans);
}
这个解法相对莫比乌斯反演有什么好处呢?
代码短啊!
如果多组询问的话,就可以使用数论分块回答啦。
重申经典结论:$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[(i,j)=1]=\left(\sum\limits_{i=1}^n\varphi(i)*2\right)-1$
既然欧拉函数这么好用,为啥还要反演呢?
求? 欧拉函数就没法直接按照定义做了。
这么说太过于人类智慧了,下面,我们考虑使用狄利克雷卷积来系统分析。
2)一些狄利克雷卷积结论:
即
这个东西是比较重要的,相应地,证明也很长。
设
我们知道是个积性函数,那么我们只要证明所有的成立。
然后根据积性和唯一分解定理,把结论扩展到全体正整数。
$\sum\limits_{d|p^k}\varphi(d)=\varphi(1)+\varphi(p)+\varphi(p^2)+...+\varphi(p^k)$
根据,
证毕。
根据,可得等价于
即
这个结论极其有用,比如说我们求
利用莫比乌斯反演,变形为$\sum\limits_{d=1}^nd*∑\limits_{t=1}^{n/d}μ(t)\lfloor n/dt\rfloor\lfloor m/dt\rfloor$
设,上式即为
$=\sum\limits_{d=1}^nd*∑\limits_{d|p}^{n}μ(p/d)\lfloor n/p\rfloor\lfloor m/p\rfloor$
可以交换求和号,得到
$=∑\limits_{p=1}^{n}\sum\limits_{d|p}d*μ(p/d)\lfloor n/p\rfloor\lfloor m/p\rfloor$
发现中间的就是所以等于
$=∑\limits_{p=1}^{n}\varphi(p)\lfloor n/p\rfloor\lfloor m/p\rfloor$
(这个式子是可以整除分块的)
这样就可以解决上文留下的问题了。
3)除数函数相关
- ;
$d(n)=\sum\limits_{d|n}1=\sum\limits_{d|n}I(d)I(n/d)=(I*I)(n)$
$d(n)=\sum\limits_{d|n}d=\sum\limits_{d|n}id(d)I(n/d)=(id*I)(n)$
把分解得到
对于每个素因子可以选0~k个,乘法原理。
$σ(n)=(1+p_1+p_1^2+...+p_1^{k_1})(1+p_2+p_2^2+...+p_2^{k_2})...(1+p_m+p_m^2+...+p_m^{k_m})$
$=(\dfrac{p_1^{(k_1+1)}-1}{p_1-1})(\dfrac{p_2^{(k_2+1)}-1}{p_2-1})...(\dfrac{p_m^{(k_m+1)}-1}{p_m-1})$
对于每个素因子可以选0~k个,拆完括号后刚好得到所有约数。
另外:$\sum\limits_{i=1}^nd(n)=\sum\limits_{i=1}^n\left\lfloor\dfrac{n}{i}\right\rfloor$
考虑在1~n中被作为约数的次数,得次。
4)一些(跳跃性)结论
在做某些毒瘤题的时候有奇效。
- 莫比乌斯函数
有
这个容易,假如大于1,那么一定会导致出现平方因子,式子的值为0.
否则按照积性分解即可。
- 除数函数
有
比较难,只会从右边推到左边。
把分解得到,分解得到
显然,每个质因子是独立的,我们考虑的情况。
$\sum\limits_{x|i}\sum\limits_{y|j}[x\perp y]=\sum\limits_{x'=0}^a\sum\limits_{y'=0}^b[x',y'\text{不同时为正}]$
大眼观察可得只有 取,且取0这个,
取,且取0这个,减去重复算的,正好是,符合要求。
- 欧拉函数
有$\varphi(ij)=\dfrac{\varphi(i)\varphi(j)(i,j)}{\varphi((i,j))}$
默认指质数。
考虑到
$=ij\left(\dfrac{\prod\limits_{p|i}\dfrac{p-1}{p}\prod\limits_{p|j}\dfrac{p-1}{p}}{\prod\limits_{p|(i,j)}\dfrac{p-1}{p}}\right)$
$=\dfrac{i\prod\limits_{p|i}\dfrac{p-1}{p}j\prod\limits_{p|j}\dfrac{p-1}{p}(i,j)}{(i,j)\prod\limits_{p|(i,j)}\dfrac{p-1}{p}}$