莫比乌斯反演 & 杜教筛 模板
前记:
突然想学杜教筛,顺便复习莫比乌斯反演。
用
0.前置
.1 积性函数
对于任意互质的整数
.2 狄利克雷卷积
定义:
对于两个数论函数
定义函数
则:
性质:
-
狄利克雷卷积满足交换律,结合律与分配律。
-
两个积性函数的狄利克雷卷积也是积性函数。
-
积性函数的逆元也是积性函数。
证明皆略。
.3 欧拉函数
定义:
对正整数
显然:
性质:
- 性质 1. 若
, 。
不大于
- 性质 2. 若
, 。
易得。
- 性质 3.
为积性函数。
证明显然。由于是积性函数,所以根据以上性质与欧拉筛结合,则:
inline void init(int n)
{
phi[1]=1;
for(register int i=2;i<=n;++i)
{
if(!phi[i]) phi[i]=i-1,p[++tot]=i;
for(register int j=1;j<=tot;++j)
{
if(i*p[j]>n) break;
if(!(i%p[j])){phi[i*p[j]]=p[j]*phi[i];break;}
phi[i*p[j]]=(p[j]-1)*phi[i];
}
}
return ;
}
- 性质 4.
。
将正整数
因为
1.莫比乌斯反演
.1 莫比乌斯函数
定义:
将正整数
实际含义为若
性质:
- 性质 1:
是积性函数。
证明显然。
由于
inline void init(int n)
{
mu[1]=1;
for(register int i=2;i<=n;++i)
{
if(!flag[i]) p[++tot]=i,mu[i]=-1;
for(register int j=1;j<=tot&&i*p[j]<=n;++j)
{
flag[i*p[j]]=true;
if(!(i%p[j])){mu[i*p[j]]=0;break;}
mu[i*p[j]]=-mu[i];
}
}
return ;
}
- 性质 2:
。
设
根据二项式定理有:
- 即
。
延伸一下,有:
- 即
。
结合
- 即
。
.2 莫比乌斯变换
对于
证明较为简单:
所以事实上
扩展:感觉证明好复杂,但是形式貌似很好背,不学证明了。
2.杜教筛
.1 杜教筛
杜教筛是一种用来求解数论函数的前缀和的算法,可以在低于线性时间内计算
对于一个数论函数
这样我们就得到了含有
也就是现在问题要求找到一个
.2 杜教筛实例
欧拉函数前缀和:
由
莫比乌斯函数前缀和:
由
前缀和:
令
上面三个要用到数论分块,所以经过一堆复杂的我不想推导的时间复杂度的推导,将
后记:
srds,是不是还应该去学 SoyTony 筛。
srds,还是除了板题啥也不会。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库