算法学习笔记(23):杜教筛
1.算法学习笔记(1):CDQ分治2.算法学习笔记(2):分块3.算法学习笔记(3):莫队算法4.算法学习笔记(4):FHQ平衡树(无旋平衡树)5.算法学习笔记(5):AC自动机6.算法学习笔记(6):优秀trick和性质合集7.算法学习笔记(7):数论8.算法学习笔记(9):第k大问题合集9.算法学习笔记(10):各种序的美好性质10.算法学习笔记(11):历史版本和线段树11.算法学习笔记(12):左偏树12.算法学习笔记(13):同余最短路13.算法学习笔记(14):区间最值操作和历史最值问题14.算法学习笔记(15): Splay树15.算法学习笔记(16):Link Cut Tree16.算法学习笔记(17):Slope trick17.算法学习笔记(18):珂朵莉树18.算法学习笔记(20):网络流19.算法学习笔记(21):数论分块20.算法学习笔记(22):莫比乌斯反演
21.算法学习笔记(23):杜教筛
22.算法学习笔记(24):筛法23.暑假集训学习笔记(1):lxl DS Day 124.暑假集训学习笔记(2):lxl DS Day 225.暑假集训学习笔记(3):lxl DS Day 326.多项式笔记27.生成函数笔记28.插头DP29.DP选讲做题记录 by 付乙淼30.拓展摩尔投票31.图论知识总结杜教筛
参考来源: OI-Wiki, 网上博客
线性筛可以在线性时间求积性函数前缀和, 而杜教筛可以用低于线性时间求解积性函数前缀和。
我们考虑
对于任意一个数论函数 g,必满足:
将
再将
当我们构造出这样的
- 可以快速计算
; - 可以快速计算 g 的前缀和,以用数论分块求解
。
则我们可以在较短时间内求得
例题
求
考虑
考虑
点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
const int N = 2e6 + 10;
unordered_map<int, ll> sphi, smu;
ll phi[N], mu[N];
int pri[N], tot, n, T;
bool p[N];
void init() {
phi[1] = 1; mu[1] = 1;
for(int i = 2; i <= 2e6; i++) {
if(!p[i]) pri[++tot] = i, phi[i] = i - 1, mu[i] = -1;
for(int j = 1; j <= tot && i * pri[j] <= 2e6; j++) {
p[i * pri[j]] = 1;
if(i % pri[j] == 0) {
phi[i * pri[j]] = phi[i] * pri[j];
mu[i * pri[j]] = 0;
break;
}
else {
phi[i * pri[j]] = phi[i] * (pri[j] - 1);
mu[i * pri[j]] = -mu[i];
}
}
}
for(int i = 2; i <= 2e6; i++) phi[i] += phi[i - 1], mu[i] += mu[i - 1];
}
ll calcphi(int n) {
if(n <= 2e6) return phi[n];
if(sphi[n]) return sphi[n];
ll res = (ll)n * ((ll)n + 1) / 2;
for(uint l = 2, r; l <= n; l = r + 1) {
r = n / (n / l);
res -= 1ll * (r - l + 1) * calcphi(n / l);
}
return sphi[n] = res;
}
ll calcmu(int n) {
if(n <= 2e6) return mu[n];
if(smu[n]) return smu[n];
ll res = 1;
for(uint l = 2, r; l <= n; l = r + 1) {
r = n / (n / l);
res -= 1ll * (r - l + 1) * calcmu(n / l);
}
return smu[n] = res;
}
int main() {
scanf("%d", &T); init();
while(T--) {
scanf("%d", &n);
printf("%lld %lld\n", calcphi(n), calcmu(n));
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App