P2568 GCD(欧拉函数,二维平面思想)
创始人
2025-05-29 01:14:38

题目描述

给定正整数 n,求 1≤x,y≤n 且 gcd(x,y) 为素数的数对 (x,y) 有多少对。

输入格式

只有一行一个整数,代表n。

输出格式

一行一个整数表示答案。

输入输出样例

输入 #1复制

4

输出 #1复制

4

说明/提示

样例输入输出 1 解释

对于样例,满足条件的 (x,y)为 (2,2),(2,4),(3,3)(4,2)。


数据规模与约定

  • 对于 100% 的数据,保证 1≤n≤107。

解析:

首先要先理解题意:gcd(x,y)是最大公约数。这道题的意思是最大公约数是一个素数。

如gcd(2,2) = 2,2为素数。

想到二维坐标,由二维坐标可以看出他们对称是以y=x;

在这种条件下,公式这里可以进行化简

 

 这是就是求解在0~n/x(x为素数)相互互素的数。

而欧拉函数的定义就是:在n的范围内于n互素的个数。

这里就是有人会问了gcd(2,2) = 2它可以化成gcd(1,1) = 1的。

欧拉函数f(1) = 1;

这样子就可以成功求出来了。

sum[3]为竖线左边的互素的个数。 

代码;

#include
using namespace std;
const int N = 1e7 + 10;
int prime[N];
int visit[N];
int pho[N];
long long sum[N];
int cnt = 0;
void get_ou(int n) {pho[1] = 1;for (int i = 2; i <= n; i++) {if (!visit[i]) {visit[i] = i;pho[i] = i - 1;prime[cnt++] = i;}for (int j = 0; j < cnt; j++) {if (prime[j] * i > N) {break;}visit[i * prime[j]] = prime[j];//表示最小的质因子if (i % prime[j] == 0) {pho[i * prime[j]] = pho[i] * prime[j];break;}pho[i * prime[j]] = pho[i] * pho[prime[j]];}}for (int i = 2; i < N; i++) {sum[i] = sum[i - 1] + pho[i];}
}
int main() {int n;cin >> n;get_ou(n);long long res = 0;for (int i = 0; i < cnt; i++) {res += sum[n / prime[i]] * 2 + 1; // 加1 是 还有(1,1)}cout << res<

相关内容

热门资讯

默茨称不希望美国干涉德国选举 德国总理默茨15日表示,不希望美国干涉德国选举。 △默茨(资料图) 默茨当天在出席政府夏季新闻发布...
以黎罗马会谈结束 消息人士称双... △7月14日,黎巴嫩南部一处遭袭地区 总台记者获悉,据以色列当地时间15日消息,以色列与黎巴嫩当天在...
中俄投了弃权票 中国常驻联合国代表团临时代办孙磊14日在安理会表决红海袭船报告授权延期决议草案后作解释性发言,强调解...
免费发券1元创收1元,最大独立... 6月30日,自称为中国最大开放、独立token供应平台的硅基流动科技股份有限公司(下称“硅基流动”)...
男子在取保候审期间躺进棺材,用... “从多次酒驾到制造死亡假象,司某以为蒙上被单、躺进棺材就能逃避法律追究,殊不知,以假死对抗司法不仅徒...