学一遍忘一遍,忘一遍学一遍,生命就是在对抗熵增
这两个玩意儿都是用来求积性函数前缀和的(满足对应要求的非积性函数也可以求一下)
杜教筛
性质要求相对高一些
求 ∑ni=1f(i) ,需要找到 g(i),h(i),满足 h=f∗g 且 f,g 都可以快速求解前缀和
令 S(n)=∑ni=1f(i),推推式子:
n∑i=1h(i)=n∑i=1∑d|if(id)g(d)=n∑d=1g(d)S(nd)
则
g(1)S(n)=n∑i=1h(i)−n∑d=1g(d)S(nd)
递归求解即可,复杂度为 O(n34)
线性筛预处理前 n23 个数后复杂度优化为 O(n23)
Min_25 筛
许多非积性函数也可以用这玩意求解,本质上是个优化埃氏筛的 DP
求 ∑ni=1f(i)
预处理不大于 √n 的质数,下用 pi 表示第 i 个质数
先求质数部分的答案
质数部分求解时用一个或多个完全积性函数拟合求解的函数,只要满足质数部分答案相同即可
令该完全积性函数其为 f0
要求 f0 可以快速求前缀和以及某一个质数的幂对应的函数值
设 g(n,i) 表示前 n 个数中质数以及最小质因数大于 pi 的合数的答案和(可以看作埃氏筛筛了前 i 个质数后的答案)
初值 g(n,0) 为 ∑ni=1f0(i)
当 pi>√n 时,显然不会再筛掉任何数了,g(n,i)=g(n,i−1)
当 pi≤√n 时,转移为:
g(n,i)=g(n,i−1)−f(pi)(g(npi,i−1)−i−1∑j=1f(pj))
然后就可以求原函数的答案了
设 S(n,i) 为前 n 个数中最小质因数不小于于 pi 的 f(x) 之和
有递推式:
S(n,i)=g(n,|P|)−i−1∑i=1f(pi)+p2j≤n∑j=ipej≤n∑e=1(f(pej)S(npej,j+1)+f(pe+1j))
答案为 S(n,1)+f(1)
复杂度为 O(n34logn),也有人说是 O(n1−ϵ),好像比杜教筛要优一点
完结散花
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人