AcWing 874. 筛法求欧拉函数
筛法求欧拉函数
一、题目描述
给定一个正整数 ,求 中每个数的欧拉函数之和。
输入格式
共一行,包含一个整数 。
输出格式
共一行,包含一个整数,表示 中每个数的欧拉函数之和。
数据范围
输入样例:
6
输出样例:
12
二、线性筛法求欧拉函数
依托于线性筛法,可以顺带求出欧拉函数值。
() ,被 定义 为
对区间内每个数进行分情况讨论:
() 质数
质数的欧拉函数值
比如,那么当中有多少个数与互质呢?显然个都是嘛。
() 非质数
数字在被尝试筛的过程中:
(设 ,简便下面的书写)
如果, 那么
证明:
【算术基本定理】
【欧拉公式】
分解质数因数的结果,只比多分解了一个,而 说明中存在因子,只不过指数增加了个。
通过瞪眼大法观察欧拉公式可知,欧拉公式只与质数因子相关,而与质数因子的幂次无关! 二者的质数因子没有变化,变化的只是某个质数因子的幂次。所以:
证毕
如果, 那么
证明:
【算术基本定理】
【欧拉公式】
分解质数因数的结果,只是比多分解了一个,而 说明中不存在这个因子,需要写上去。
证毕
三、实现代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
int primes[N];
int cnt;
int phi[N];
int st[N];
int res;
void get_eulers(int n) {
phi[1] = 1;
for (int i = 2; i <= n; i++) {
if (!st[i]) {
primes[cnt++] = i;
phi[i] = i - 1; // ①质数
}
for (int j = 0; primes[j] <= n / i; j++) {
int t = primes[j] * i;
st[t] = 1;
if (i % primes[j] == 0) {
phi[t] = phi[i] * primes[j]; // ② i%pj==0
break;
} else
phi[t] = phi[i] * (primes[j] - 1); // ③i%pj>0
}
}
}
signed main() {
int n;
cin >> n;
get_eulers(n);
for (int i = 1; i <= n; i++) res += phi[i];
printf("%lld\n", res);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2022-03-24 AcWing 1146. 新的开始
2022-03-24 AcWing 1144. 连接格点
2022-03-24 AcWing 1143. 联络员