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<

相关内容

热门资讯

受益于“AI+黄金”,中国矿业... 12月22日,紫金矿业(601899.SH),A股收涨4.53%,当日A+总市值达到8623亿元!紫...
新相微:子公司拟1亿元参与北电... 新京报贝壳财经讯 12月22日,新相微发布公告称,公司全资子公司上海新相拟以1亿元向北电数智进行增资...
国际金价,再创新高! 美国纽约商品交易所黄金期货价格21日再创历史新高。其中,交投最活跃的2026年2月黄金期价盘中突破每...
排队上百桌,复购率超40%,现... 总第4438期作者 |餐饮老板内参蔡大柒反常规打法:选择低品类认知的拌川,用中餐逻辑做一碗面创立“椿...
俄武装力量总参谋部作战训练局长... 当地时间22日,据俄罗斯联邦侦查委员会通报,俄罗斯武装力量总参谋部作战训练局局长萨尔瓦罗夫中将当天在...