Description
求积性函数前缀和的有力工具,形式化地,对于积性函数 f(x),求
n∑i=1f(i)
这里设两个函数 g,h,其中 h=f∗g(狄利克雷卷积),以及 S(n)=n∑i=1f(i)
n∑i=1h(i)=n∑i=1∑j|if(j)×g(ij)
考察每个 g(i) 对 LHS 的贡献有:
n∑i=1h(i)=n∑i=1g(i)S(⌊ni⌋)
提出来第一项就得到了 g(1)S(n),直接得到下式:
g(1)S(n)=n∑i=1h(i)−n∑i=2g(i)S(⌊ni⌋)
可以整除分块并递归,可以先预处理 106 项,但是主要问题是函数 f,g 的选择
最基础的是 μ∗I=ϵ,φ∗I=id,(φ×id)∗id=id2
复杂度证明
考虑所有递归中出现的 n 进行求和,大体看做所有 ⌊ni⌋,而每次递归一个 n 耗费的复杂度是 √n,那么复杂度写作下式:
T(n)=√n∑i=1√⌊ni⌋+√i
加号后的一项总和明显小于加号前的一项的总和,加号前的一项总量为
√n∑i=1√⌊ni⌋=∫√n1√n√x dx=√n√√n
定积分求解即先提出定量 √n,求出不定积分上下界的 1,(√n)−12+1 再作差
直接做复杂度就是 Θ(n34),尝试预处理 n1−t 的函数前缀和,扩大递归终止条件的范围,这时候缩小积分上界至 nt 结果是 n2t,中和一下预处理 n13 时复杂度达到了 Θ(n23)
个人认为在多数 n=109 的题目中由于记忆化的 std::map
有 log 复杂度所以多预处理一些总归是没错的
另外这里的证明方式是考虑的递归总量,那么具体问题中如果涉及了外层套整除分块内次求积性函数区间和,使用杜教筛总复杂度不变
例题
BZOJ3512
考虑对每个 ≤N 的每个 n 计算 m∑i=1φ(ni),尝试展开 φ(ni)
不难根据 φ 函数的定义式,我们只关注每个质数的第一次出现,所以设 q 为 n 所有质因子的单次乘积
m∑i=1φ(ni)=nqm∑i=1φ(i)φ(qgcd(i,q))gcd(i,q)
考虑使用 φ∗I=id 改写 gcd(i,q):
nqm∑i=1φ(i)φ(qgcd(i,q))∑d|q,d|iφ(d)
将后两项合并,使用欧拉函数的积性:
nqm∑i=1φ(i)∑d|i,d|qφ(gcd(i,q)d)φ(qgcd(i,q))
nqm∑i=1φ(i)∑d|i,d|qφ(qd)
nq∑d|qφ(qd)⌊md⌋∑i=1φ(id)
发现了 S(d,⌊md⌋) 所以可以递归了,记得边界和记忆化,可能的复杂度上界是 Θ(n√m)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律