Number Theory(4)
11 莫比乌斯函数
尝试按照《具体数学》的顺序引入莫比乌斯反演。
11.1 引入
莫比乌斯函数
来定义。
这个式子实际上是一个递归式,左边的
在 1857 年,Richard Dedekind 和 Joseph Liouville 注意到了如下重要的 “反演原理”。
这就是我们熟知的 莫比乌斯反演。
发现这个东西的证明是容易的:如果
反之,如果
于是我们在这里就证明了 莫比乌斯反演。
而莫比乌斯反演还可以被表示成
现在回到最开始的那个式子,发现其实就是
当
由此推出
于是,我们就推出了
如果我们把之前的欧拉反演视作
也就是
接下来我们尝试用容斥的角度来理解莫比乌斯函数。
设
就是对
11.2 线性筛莫比乌斯函数
根据定义是,线性筛莫比乌斯函数是非常容易的。
mu[1]=1;
for(int i=2;i<=maxn;i++){
if(!vis[i]) p[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&i*p[j]<=maxn;j++){
vis[i*p[j]]=true;
if(i%p[j]==0) break;
mu[i*p[j]]=-mu[i];
}
}
11.3 常见技巧
对于 莫比乌斯反演,我们常常用式子
它把
于是我们就可以这样解决下面的式子:
相当于对最大公约数为
而这个式子是非常容易用整除分块完成。
11.4 例题
接下来,我们来将一些例题,由于比较多,所以单独提出来了。部分例题会用到上面的常见技巧。
前面的一些例题中有些写得比较简略,有些可能是👻乐团中的子问题,如果看不懂可以在那道题题解中找一下,或者直接问我。
P2522 [HAOI2011] Problem b
对于给出的
个询问,每次求有多少个数对 ,满足 , ,且 , 函数为 和 的最大公约数。
, , 。
首先可以对式子做一个二维差分,转换成求下界为
我们把
这就是一个经典的莫反式子,直接作就可以得到
于是就可以用整除分块在
子问题:P3455 [POI2007] ZAP-Queries。
P2257 YY的GCD
给定
,求 , 且 为质数的 有多少对。
, 。
问题就是求
我们用莫反相关知识对其进行推导可以得到
于是我们令
前面可以直接用整除分块完成,而后面的
但细想发现这是可以和莫比乌斯函数一起在线性筛中解决的,所以我们就可以直接预处理出其前缀和,从而做到时间复杂度
双倍经验:P2568 GCD。
SP5971 LCMSUM - LCM Sum
次询问,每次询问给出 ,求
。
首先我们考虑把
我们设
只要我们求出这个,就可以计算上面的式子了。
首先我们可以暴力用莫反计算,也就是
我们发现后面可以被拆成
还有另外一种方法就是对与
而显然
现在原式就变成了
而这里的
P4318 完全平方数
次询问,每次询问给出一个 ,查询第 个不是完全平方数的正整数倍数的数。
。
设
怎么求
发现可以先去掉
相当于做容斥,那么我们就有
直接计算,时间复杂度
P1829 [国家集训队] Crash的数字表格 / JZPTAB
给定
,求
。
后面的式子就和 SP5971 一样了。直接做就是线性的。代码。
P3704 [SDOI2017] 数字表格
Doris 刚刚学习了 fibonacci 数列。用
表示数列的第 项,那么 Doris 用老师的超级计算机生成了一个
的表格, 第
行第 列的格子中的数是 ,其中 表示 的最大公约数。 Doris 的表格中共有
个数,她想知道这些数的乘积是多少。 答案对
取模。
, 。
稍微推一下式子就是
预处理一下括号内的东西,整除分块之后可以做到单次
P5221 Product
给定
,求
,时限 。
有些人喜欢在写完👻之后来写这道题。
话不多说,直接暴力推一下式子就是了。
前面的直接阶乘处理一下,后面的我们枚举 gcd 就可以得到
于是两次整除分块就可以线性完成了,代码相当好些。代码。
P3911 最小公倍数之和
对于
,求
。
给定具体的数是不好处理的,所以我们考虑先令
那么
我们令
于是只要我们令
其中
这样就做完了,查询时可以直接线性完成。代码。(暴力枚举计算
双倍经验:AGC038C LCMs。
CF1285F Classical?
有
个整数 ,求
。
求完了和,我们现在来求
考虑加上一个
容易发现这是可以用单调栈直接维护的,那么我们如何计算出是否有与
通过上面有关
只要这个值不为
时间复杂度
而对于
我们可以枚举每一个
发现如果
P3327 [SDOI2015] 约数个数和
给定
,求
在常见技巧中,我们列出了整个式子的转化。
于是式子就是
于是直接对这个式子莫反就可以得到
令
于是式子就是
直接整除分块可以做到时间复杂度
P4619 [SDOI2018] 旧试题
给定
求
。
更为厉害的约数个数和。
多了一个变量,但是按照之前的转化方式是类似的
那么我们就可以对这个东西进行莫反了
我们可以令
然后你发现这还是
真的没有用吗?这个式子在哪些地方是有值的呢?
容易发现我们首先需要保证
那么也就是对于任意的两个点,它们可以成为一组就意味着
这个做法看起来根本不可行,并且直接这样建边是
但是细想一下,这个条件是相当严的,要求
每一次我们枚举了质数的子集,而
下面给出这一部分的代码实现。
for(int g=1;g<=mx;g++)
for(int i=1;i*g<=mx;i++)
if(mu[i*g])
for(int j=i+1;1ll*i*j*g<=mx;j++)
if(mu[j*g]&&gcd(i,j)==1){
int u=i*g,v=j*g,w=i*j*g;
/*...*/
}
进而,我们发现这样的点对并不多,实测发现只有 760741 个!赢麻了!
那么现在成了怎么找三元环,可以尝试阅读 这篇博客。
也就是我们将无向边定向,每一条边从度数大的点连向度数小的,然后这样去枚举的时间复杂度就是
于是我们就做完了!直接枚举就可以了。
for(int x=1;x<=mx;x++){
for(auto i:G[x]) vis[i.fi]=i.se;
for(auto i:G[x]){
int y=i.fi,wxy=i.se;
for(auto j:G[y]){
if(!vis[j.fi]) continue;
int z=j.fi,wyz=j.se,wxz=vis[z],val=mu[x]*mu[y]*mu[z];
/*...*/
}
}
for(auto i:G[x]) vis[i.fi]=0;
}
这样就可以做到
存在把上面式子化成
三倍经验:CF236B Easy Number Challenge 和 CF235E Number Challenge。
P5518 [MtOI2019] 👻乐团 / 莫比乌斯反演基础练习题
东风谷 早苗(Kochiya Sanae)非常喜欢幽灵乐团的演奏,她想对她们的演奏评分。
因为幽灵乐团有
个人,所以我们可以用 个正整数 来表示出乐团演奏的分数,她们的演奏分数可以表示为 因为音乐在不同的部分会有不同的听觉感受,所以
会在 中发生变化,其中: 因为乐团的歌实在太好听了,导致分数特别高,所以她们的分数要对给定的正整数
取模。 因为有很多歌曲要演奏,所以早苗给出了
组询问。
再来一个三重循环的题。
众所周知,cdqz 机房有且仅有三个👻,它们是:
-
:有名字 的👻,也是👻乐团的团长!
-
:没名字 的👻。
-
:直接消失的👻,这样的👻常常从你身边飘过!
这三只👻就是 cdqz 机房的真神!/bx
题目名字都告诉你了,还是赶紧来推式子吧。
首先对于 Type = 0/1 是简单的,直接顺着思路往下面推就可以了,也就是这个样子:
对于 Type = 0,我们首先把
前面两项是可以直接用阶乘完成的,也就是说我们只需要求
这个时候你可以把上面的指数部分单独提出来用一个函数完成,这样就可以做到线性,是可以过的,也就是后面代码1给出的(把三个 Type 分开了写的)。
但是你推到后面会发现这其实也是 Type = 2 的子问题,而这个式子是可以
而中间那一块是可以直接用
恭喜你,获得了
现在我们来研究 Type = 1,用同样的思路,写出来的式子也是简单的
把前面两项提出来就是形如
预处理一下
而对于后面两项,也就是求
这个东西推导方式就较为类似了,笔者并没有把它推导
于是可以把指数部分提出来,就变成了求
然后两次整除分块就可以完成。
很明显和上面 Type = 0 的优化类似,这时可以做到
预处理一下
最后来搞 Type = 2 的情况,按照相同的思路先展开一下
对于前两项,其实就是(后面的
像往常一样,我们直接用
把
容易发现这两项都可以用整除分块做出来的,稍微预处理一下
而对于后面两项,也就是求
按照之前的经验,我们尝试去枚举
然后就有
你可以自己尝试推一下,就会发现只能用
那怎么办呢?
式子中还存在一个
上面的内容和之前推第一部分类似,而现在我们发现其实中间的
其实就是 Type = 0 中我们推的
惊奇地发现这两部分前面的那一块其实是一样的,于是它们就抵消啦!
所以我们需要求的就是
和
于是你就可以用两次整除分块线性求出来啦!
这样你就推出了本题的全部式子,写的时候注意细节,在指数上面的东西注意模的是
本题存在对于 Type = 2 的情况求
P3700 [CQOI2017] 小 Q 的表格
为了完成任务,小 Q 需要列一个表格,表格有无穷多行,无穷多列,行和列都从
开始标号。为了完成任务,表格里面每个格子都填了一个整数,为了方便描述,小 Q 把第 行第 列的整数记为 。为了完成任务,这个表格要满足一些条件:
- 对任意的正整数
,都要满足 ; - 对任意的正整数
,都要满足 。 为了完成任务,一开始表格里面的数很有规律,第
行第 列的数恰好等于 ,显然一开始是满足上述两个条件的。为了完成任务,小 Q 需要不断的修改表格里面的数,每当修改了一个格子的数之后,为了让表格继续满足上述两个条件,小 Q 还需要把这次修改能够波及到的全部格子里都改为恰当的数。由于某种神奇的力量驱使,已经确保了每一轮修改之后所有格子里的数仍然都是整数。为了完成任务,小 Q 还需要随时获取前 行前 列这个有限区域内所有数的和是多少,答案可能比较大,只需要算出答案 之后的结果。
, , 。
建议盯着式子发呆。
首先,由于
而你把第二个式子换一种写法就是
多写几个就变成了
那么换一种写法就是
我们发现这个东西和辗转相除求 gcd 是一样的,那么我们就可以得到这个很好的性质
那么
于是我们要求的答案其实就是
那么现在就是希望求
我们需要预处理出所有的
但是按照上一道题我们推式子的方法,发现单次是
这时我们考虑在 SP5971 中求的东西
带进去就是
于是这个东西就可以线性递推出来了,只要我们能够动态维护
但是我们发现上面所说的
具体每个块每个元素维护块内的前缀和,在每一个块末尾维护块间的前缀和,修改时暴力修改即可。
总时间复杂度
本文作者:H_W_Y
本文链接:https://www.cnblogs.com/H-W-Y/p/18203764/NumberTheory4
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步