AcWing - 筛法求欧拉函数(筛法&欧拉函数)
发布日期:2021-07-01 00:21:36
浏览次数:3
分类:技术文章
本文共 1917 字,大约阅读时间需要 6 分钟。
题目链接:
时/空限制:1s / 64MB题目描述
给定一个正整数n,求1~n中每个数的欧拉函数之和。
输入格式
共一行,包含一个整数n。
输出格式
共一行,包含一个整数,表示1~n中每个数的欧拉函数之和。
数据范围
1≤n≤10^6
输入样例
6
输出样例
12
解题思路
题意:求1~n中每个数的欧拉函数之和。
思路:在这个题目中我们不能直接分别去求1~n之间的欧拉函数,会超时,所以我们就可以根据素数筛那样进行欧拉筛法。要想求欧拉函数需要用到以下几个性质(p为质数):
证明:
- 因为质数p除了1以外的因子只有p,所以与p互素的个数是p-1个。
- 令,小于n的正整数共有个,其中与p不互质的个数共个,它们是,所以。
- 如果i mod p = 0, 那么 phi(i * p) = p * phi(i) (证明略,其实不会证...)
- 如果i mod p != 0, 那么 phi(i * p) = phi(i) * (p-1)
证明:
- i mod p 不为0且p为质数, 所以i与p互质,那么根据积性函数的性质 phi(i * p) = phi(i) * phi(p),其中phi(p) = p-1,所以 phi(i * p) = phi(i) * (p-1).
根据这些性质,我们就可以写代码了。
Accepted Code:
//埃筛/* * @Author: lzyws739307453 * @Language: C++ */#includeusing namespace std;const int MAXN = 1e6 + 5;int phi[MAXN];void Euler(int n) { for (int i = 0; i <= n; i++) phi[i] = i; for (int i = 2; i <= n; i++) { if (!(phi[i] != i)) { for (int j = i; j <= n; j += i) phi[j] = phi[j] / i * (i - 1); } }}int main() { int n; scanf("%d", &n); Euler(n); long long ans = 0; for (int i = 1; i <= n; i++) ans += phi[i]; printf("%lld\n", ans); return 0;}
//线性筛/* * @Author: lzyws739307453 * @Language: C++ */#includeusing namespace std;const int MAXN = 1e6 + 5;bool vis[MAXN];int prime[MAXN], phi[MAXN];void Euler(int n) { phi[1] = 1; int cnt = 0; for (int i = 2; i <= n; i++) { if (!vis[i]) { prime[cnt++] = i; phi[i] = i - 1; } for (int j = 0; j < cnt && prime[j] <= n / i; j++) { vis[prime[j] * i] = true; if (i % prime[j]) phi[i * prime[j]] = phi[i] * (prime[j] - 1); else { phi[i * prime[j]] = phi[i] * prime[j]; break; } } }}int main() { int n; scanf("%d", &n); Euler(n); long long ans = 0; for (int i = 1; i <= n; i++) ans += phi[i]; printf("%lld\n", ans); return 0;}
转载地址:https://lzyws739307453.blog.csdn.net/article/details/99691777 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年05月06日 12时02分11秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
java多线程-(无锁)CAS算法基础
2019-05-01
commons-csv的基本操作
2019-05-01
java 多线程之Exchanger
2019-05-01
java 多线程之Future与FutureTask
2019-05-01
rocketmq(broker配置参数设置)不断更新中
2019-05-01
rocketMQ实战(四): hello world
2019-05-01
抖音、腾讯、阿里、美团春招服务端开发岗位硬核面试(完结)
2019-05-01
token超时刷新策略
2019-05-01
9种分布式ID生成方式,总有一款适合你
2019-05-01
由DFS到访问者模式
2019-05-01
字节的面试题到底有多难?大厂为何都注重算法?
2019-05-01
阿里大师呕心整理出来的分布式事务至尊级学习笔记!干货满满!
2019-05-01
膜拜!这份技术点拉满的Redis深度历险笔记,价值百万!
2019-05-01
RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)
2019-05-01
xtrabackup备份之增量备份(二)
2019-05-01
《视频直播技术详解》系列:(6)编码和封装
2019-05-01
类函数重写、重载、覆盖示例
2019-05-01
五种主要多核并行编程方法分析与比较
2019-05-01
GB28181计算注册登陆时的鉴权信息
2019-05-01
人工智能为什么这么火?看看安防江湖30年血战就知道了
2019-05-01