筛法求欧拉函数之和
题目描述
求
想法
- 如果
是质数
质数
只有 和 两个因数, 不和 本身互质,因数只有一个 ,所以互质的数就有 个
- 如果
不是质数
是质数
则即 的一个质因子,所以 中已经包含了
①
因为②
将②代入①中得:
则不是 的质因子,根据 线性筛
中的推导,是 的最小质因子 所以
由1可得,如果是质数:
发现过程中有关质因数,想到线性筛
所以我们可以套用线性筛的板子
码来!
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e6+10;
typedef long long LL;
int primes[N], idx; // 记录质数,idx是下标
int phi[N]; // 存储每个欧拉函数的值
bool st[N]; // 是否是质数
LL get_phi(int n)
{
phi[1] = 1;
for (int i = 2; i <= n; i ++ )
{
if(!st[i]) // 如果i是质数
{
primes[idx++] = i;
phi[i] = i - 1;
}
for (int j = 0; primes[j] <= n / i; j ++ )
{
int t = primes[j] * i;
st[t] = true;
if(i % primes[j] == 0) // j是i的质因数的情况
{
phi[t] = phi[i] * primes[j];
break;
}
// j不是i的质因数的情况
phi[t] = phi[i] * (primes[j] - 1);
}
}
LL res = 0; // 用longlong类型存储 —— 怕爆int
for(int i = 1; i <= n; i++)
{
res += phi[i]; // 计算从1到n的欧拉函数之和
}
return res;
}
int main()
{
int n;
cin >> n;
LL ans = get_phi(n);
printf("%lld\n", ans);
return 0;
}
欢迎大佬指出本蒟蒻的错误!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?