bzoj 2818 Gcd 【欧拉函数】
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了bzoj 2818 Gcd 【欧拉函数】,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1181字,纯文字阅读大概需要2分钟。
内容图文
![bzoj 2818 Gcd 【欧拉函数】](/upload/InfoBanner/zyjiaocheng/1329/f9dac9a8dcc74f1986dd1d57b9650d59.jpg)
问题:求gcd(x,y)==质数, 1<=x,y<=n的有多少对?
做这题的时候,懂得了一个非常重要的转化:求
(x, y) = k, 1 <= x, y <= n
的对数等于求
(x,
y) = 1, 1 <= x, y <= n/k
的对数!所以,枚举每个质数
p,
然后求
(x,
y) = 1, 1 <= x, y <= n/p
的个数。
(x, y) = 1 的个数如何求呢?欧拉函数!
#include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #include <math.h> #include <ctype.h> #include <time.h> #include <queue> #include <iterator> using namespace std; const int MAXN = 1000000; int n; int main() { while (scanf("%d", &n) != EOF) { bool com[MAXN]; int primes = 0, prime[MAXN], phi[MAXN]; phi[1] = 1; for (int i = 2; i <= n; ++i) { if (!com[i]) { prime[primes++] = i; phi[i] = i - 1; } for (int j = 0; j < primes && i*prime[j] <= n; ++j) { com[i*prime[j]] = true; if (i % prime[j]) phi[i*prime[j]] = phi[i] * (prime[j] - 1); else { phi[i*prime[j]] = phi[i] * prime[j]; break; } } } for (int i = 2; i <= n; i++) phi[i] = phi[i] + phi[i-1]; long long ans = 0; for (int i = 0; i < primes; i++) ans += phi[n/prime[i]] * 2 -1; printf("%lld\n",ans); } return 0; }
原文:http://blog.csdn.net/u014427196/article/details/44201813
内容总结
以上是互联网集市为您收集整理的bzoj 2818 Gcd 【欧拉函数】全部内容,希望文章能够帮你解决bzoj 2818 Gcd 【欧拉函数】所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。