来自Sharpness的省选复习计划中的莫比乌斯反演/筛法。
例题1
线性筛素数,每个数只会被它最小质因子筛掉,借此我们可以线性求出很多积性函数如μ , φ等。
例题2
整除分块,给定n,则⌊ni⌋的取值不超过√N种,因为i≤√N时不超过√N种取值,>√N时也不超过√N
所以我们可以把所有⌊ni⌋相同的i分到一段。总共不超过√N段。
整除分块的写法可以直接套用。
代码
例题3
在[L,R]选出N个数使得他们的gcd=K。不妨将所有数/k,将问题转换为在[L′,R′]中选取N个数使得gcd=1。显然这可以直接暴算了。
题目给出R−L≤105,考虑更简单的方法。我们可以先求出f[i]表示公约数为i的方案数,再通过f[k×i],k∈N+,容斥求出最大公约数为i的方案数。
代码
迪利克雷卷积#
h=f∗g,则有h(n)=∑d|nf(d)g(nd) 。
性质 1:若f,g为积性函数,则f∗g也为积性函数。
证明:
- 如果p⊥q,则 w|pq 与 w=uv,u|p∧v|q一一对应 。因为w的每一个质因子可以唯一分配到 p 或者 q 中。
- 所以h(p×q)=∑w|pqf(w)g(pqw)=∑u|p,v|qf(u)f(v)g(pu)g(qv)=h(p)h(q)
性质 2:μ∗1=ϵ
应用:n∑i=1m∑j=1[gcd(i,j)=1]=n∑i=1m∑j=1∑d|i,jμ(d)=min(n,m)∑d=1μ(d)⌊nd⌋⌊md⌋
性质 3:φ∗1=Id
应用:n∑i=1m∑j=1gcd(i,j)=n∑i=1m∑j=1∑d|i,jφ(d)=min(n,m)∑d=1φ(d)⌊nd⌋⌊md⌋
例题4
莫比乌斯反演模板题。
利用性质 2 ,用线性筛预处理μ,然后整除分块可以做到O(T√N)
代码
例题5
经典 trick : σ(ij)=i∑a=1j∑b=1[gcd(a,b)=1] 。
然后利用性质2求解即可。
代码
杜教筛#
杜教筛用来在优于线性的时间复杂度内求出积性函数的前缀和。
如果我们需要求积性函数 f 的前缀和 S,我们可以找一个合适的函数 g,令h=f∗g。
n∑i=1h(i)=n∑i=1∑d|ig(d)f(id)=n∑d=1g(d)nd∑i=1f(i)=n∑d=1g(d)S(nd)
所以有
n∑i=1h(i)−n∑d=2g(d)S(nd)=g(1)S(n)
如果我们选取的g函数能使得∑h(i)快速求出,我们可以将这个问题递归分解下去。由问题S(n)分解到S(nd)。并不难得到一个时间复杂度为O(N34)。
考虑优化,我们可以将所有≤M 的 S(i) 全部筛出来,不难证得当M=N23时,时间复杂度最优且为O(N23)。
例题6
利用μ,φ函数的性质。μ∗1=ϵ,φ∗1=Id,其中函数 1,ϵ,Id 的前缀和都可以 O(1) 求得,直接套用上面的公式即可。
代码
例题7
转化一下,发现我们需要求n∑i=1i2φ(i)。
根据套路,我们令f(n)=n2φ(n),g(n)=n2。令h=f∗g,有:
h(n)=∑d|nf(d)g(nd)=n2∑d|nφ(d)=n3
g,h的前缀和都非常好求,而f又是个积性函数,所以直接上杜教筛即可。
代码
好现在你已经精通莫反和基础筛法了,试着完成下面的练笔吧XD。
T1:代码
T2:代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通