莫比乌斯函数及反演学习笔记
前置知识
艾佛森括号:
表示 是 的因子
整除分块:
没有特殊说明时表示质数
表示质数集, 表示整数集。
常见的函数:
- 常函数:
- 单位元函数:
- 恒等函数:
- 因子函数:
- 因子和函数:
- 欧拉函数:
函数
数论函数
数论函数指一类定义域是正整数,值域是一个数集的函数。有:
积性函数
当数论函数
则数论函数
例如:
完全积性函数
当积性函数
则积性函数
例如:
积性函数的实现
那么,积性函数像下面的
我们需要通过想欧拉筛筛质数的方式来快速筛出积性函数。
比如我们现在要筛积性函数
我们需要先对每一个
- 当
时,则 ; - 当
时,我们先记 表示 ,则 。
这样我们就可以不重不漏的筛出函数
void init(ll n){
isp[1]=low[1]=1;
f[1]=对1直接定义;
for(ll i=2;i<=n;i++){
if(!isp[i]) low[i]=p[++cnt]=i,f[i]=对质数直接定义;
for(ll j=1;j<=cnt&&i*p[j]<=n;j++){
isp[i*p[j]]=1;
if(i%p[j]==0){
low[i*p[j]]=low[i]*p[j];
if(low[i]==i)
f[i*p[j]]=对质数的若干次幂进行定义(一般由f[i]递推);
else
f[i*p[j]]=f[i/low[i]]*f[low[i]*p[j]];
break;
}
low[i*p[j]]=p[j];
f[i*p[j]]=f[i]*f[p[j]];
}
}
}
狄利克雷卷积 (dirichlet)
定义两个函数
同时狄利克雷卷积满足以下一些性质:
- 对于每一个
的函数 都有逆元 ,使得
那么对于一个
我们只需要通过狄利克雷卷积的定义简单推导一下得到:
这样就有:
欧拉函数 (Euler)
定义
欧拉函数用
解释:
公式
先设
证明:
我们先假设只存在质因子 。
考虑容斥,与互质的数就是所有数减去 。
同时根据容斥原理,需要补回。
即
那么同理,当时,有:
积性函数
函数
即
证明:
设
性质
证明:
记。则由于:
可以得到为积性函数。
设。
而对于
实现
我们可以通过线性筛筛质数的时候是顺便就把欧拉函数筛出来。
void Euler(int n){
phi[1]=1;
for (int i=2;i<=n;i++){
if (!isp[i])primes.push_back(i),phi[i]=i-1;
for(auto p:primes){
if(p*i>n)break;
isp[p*i]=1;
if (!(i%p)){
phi[p*i]=phi[i]*p;
break;
}else phi[p*i]=phi[p]*phi[i];
}
}
}
莫比乌斯函数 (Möbius)
定义
莫比乌斯函数用
解释一下对
- 当
时, ; - 当
含有任何的质因子的幂次 , ; - 当
,且所有 的互不相同时,
性质
只知道莫比乌斯函数的定义还远远不够,我们还需要了解一下他的性质:
。
证明:
当
时, 。 当
时,我们记
当时, 。
当时,对于 这样的存在 个。
由二项式定理:
证明:
根据得
实现
和欧拉函数一样,也可以在筛质数的时候顺便得到。
void getMu(int n){
mu[1]=1;
isp[0]=isp[1]=1;
for(int i=2;i<=n;++i){
if(!isp[i])mu[p[++cnt]=i]=-1;
for(int j=1;j<=cnt&&p[j]*i<=n;++j){
isp[i*p[j]]=1;
if(!(i%p[j]))break;
else mu[p[j]*i]=-mu[i];
}
}
}
莫比乌斯反演
当存在有两个函数
则一定有:
证明:
倍数形式:
例题
设
则通过莫比乌斯反演的倍数形式可以得到:
我们在考虑对于函数
我们在将函数
那么对于最后的答案我们只需要一个简单的容斥:
通过上的函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具