算法学习笔记(23):杜教筛

杜教筛

参考来源: OI-Wiki, 网上博客
线性筛可以在线性时间求积性函数前缀和, 而杜教筛可以用低于线性时间求解积性函数前缀和。

我们考虑 S(n) 就是积性函数的前缀和, 所以我们尝试构造关于 S(n) 关于 S(ni) 的递推式。

对于任意一个数论函数 g,必满足:

i=1n(fg)(i)=i=1ndig(d)f(id)=i=1ng(i)S(ni)

S(n) 提出来就可以得到:

g(1)S(n)=i=1ng(i)S(ni)i=2ng(i)S(ni)=i=1n(fg)(i)i=2ng(i)S(ni)

再将 g(1) 移过去即可得到 S(n) 的递推式, 考虑我们可以自己构造 g(n) 使得计算变快。

当我们构造出这样的 g(n) 时:

  1. 可以快速计算 i=1n(fg)(i)
  2. 可以快速计算 g 的前缀和,以用数论分块求解 i=2ng(i)S(ni)

则我们可以在较短时间内求得 g(1)S(n)

例题

P4213 【模板】杜教筛

μϕ 的前缀和, 考虑一个性质, μ1=εϕ1=id

考虑 i=1n(fg)(i) 也就是 idε, 可以快速计算。

考虑 g(i) 也就是 1, 我们可以快速计算, 所以可以直接数论分块了。

点击查看代码
#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;
}
posted @   qqrj  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示