莫比乌斯函数入门
莫比乌斯函数入门
之前遇到过很多次莫反的题,但是每次做完就忘了,云里雾里,所以写一篇来好好记忆一下,下次再忘了就回来看看。
内容和OIWIKI有很大部分的重叠,但是更偏向结论和做法,同时舍弃了一些看不懂的,大多数为别人的复述。
莫比乌斯函数定义:
性质
积性函数
性质
证明
设
则
解释
容易发现
证明,若
若
若
所以第一个式子是成立的,再者
根据二项式定理
为上面的式子添加一个
利用
因为
void getMu() {
mu[1] = 1;//初始化
for (int i = 2; i <= n; ++i) {
if (!flg[i]) p[++tot] = i, mu[i] = -1;//质数的情况
for (int j = 1; j <= tot && i * p[j] <= n; ++j) {
flg[i * p[j]] = 1;
if (i % p[j] == 0) {
mu[i * p[j]] = 0;
break;
}
mu[i * p[j]] = -mu[i];//多一个质因数
}
}
}
补充结论
人话翻译:左边成立,右边为
证明:略
莫比乌斯反演
这两条就是莫比乌斯反演的结论。
例题
P2522 [HAOI2011] Problem b
原问题相当于询问一个矩阵,用类似于二维前缀和的方式将其拆开,每一部分都是形如:
的样子,可以化简为:
由之前的结论可得:
我们枚举
后面两部分都可以快速的算出,再得:
容易发现现在已经可以
SP5971 LCMSUM - LCM Sum
推狮子。
将
枚举
像上面一道题一样。
经典结论再得:
和上面一样。
枚举
设
设
枚举
筛出后面这一坨东西,可以一次一次地分开筛。code
杜教筛
一个能在
定义
狄利克雷卷积
定义两个数论函数
这个东西满足结合律,交换律。
实际上莫比乌斯繁反演就是
还有式子,
流程
假设我们有一个积性函数
这样我们就能够通过杜教筛快速得到
我们知道:
并枚举
令
同时有:
也就是说:
然后我们对后面的
通过 unordered_map
记忆化和提前筛出前
我们知道
int gmu(int x)
{
if(x < V-5) return smu[x] ;//提前筛除mu的前缀和
if(Smu.find(x) != Smu.end()) return Smu[x] ;//记忆化
int res = 1 ;//前缀和为 1
for(int le = 2,ri ; le <= x ; le = ri+1)
ri = min(x,x/(x/le)),res -= (ri-le+1)*gmu(x/le) ; return Smu[x] = res ;
}
我们知道
代码差不多,就是算
int gphi(int x)
{
if(x < V-5) return sphi[x] ;
if(Sphi.find(x) != Sphi.end()) return Sphi[x] ; int res = (x+1)*x/2ll ;
for(int le = 2,ri ; le <= x ; le = ri+1)
ri = min(x,x/(x/le)),res -= (ri-le+1)*gphi(x/le) ; return Sphi[x] = res ;
}
先推一下式子:
所以枚举
我们会发现后面两个循环是有通项公式的,记为
显然可以对
注意到这比普通的
显然这个
需要注意的是即使外面有一层整除分块,但时间仍然为
...
后面有时间了再更,就当入个门
本文作者:谭皓猿
本文链接:https://www.cnblogs.com/snow-panther/p/17527007.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步