首页 > 其他分享 >最大公约数

最大公约数

时间:2023-01-21 19:12:06浏览次数:45  
标签:frac gcd int 质数 leq 最大公约数

最大公约数

给定整数 $N$,求 $1 \leq x,y \leq N$ 且 $\text{GCD}(x,y)$ 为素数的数对 $(x,y)$ 有多少对。

$\text{GCD}(x,y)$ 即求 $x$,$y$ 的最大公约数。

输入格式

输入一个整数 $N$。

输出格式

输出一个整数,表示满足条件的数对数量。

数据范围

$1 \leq N \leq {10}^{7}$

输入样例:

4

输出样例:

4

 

解题思路

  直接枚举$(x, y)$是不可取的,如果定义一种映射关系$(x, y) \stackrel{f}{\longrightarrow} p$,其中$p$是质数。因此当数对$(x, y)$的最大公约数为质数就满足这个映射关系。可以发现自变量很多,而因变量很少,因此考虑能不能来枚举因变量来求自变量的个数。

  枚举$1 \sim N$种的每一个质数$p$,如果有$\gcd(x, y) = p$,那么有$\gcd(\frac{x}{p}, \frac{y}{p}) = 1$。记$x' = \frac{x}{p}$,$y' = \frac{y}{p}$,满足$1 \leq x', y' \leq \left\lfloor {\frac{N}{p}} \right\rfloor$。因此问题从在$1 \sim N$中有多少个$(x, y)$的$\gcd(x, y) = p$变成了在$1 \sim \left\lfloor {\frac{N}{p}} \right\rfloor$中有多少个$(x, y)$的$\gcd(x, y) = 1$,就是可见的点的模型。

  因此对于质数$p$,所要求的$(x, y)$的个数为$s_p = 2 \cdot \sum\limits_{i = 2}^{\left\lfloor {\frac{N}{p}} \right\rfloor}{\varphi(i)} + 1$。因此总的答案就是$\sum\limits_{\text{不超过N的质数}p}{s_p}$。因此还需要对$\varphi(i)$求一个前缀和。

  AC代码如下:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 typedef long long LL;
 5 
 6 const int N = 1e7 + 10;
 7 
 8 int primes[N], cnt;
 9 bool vis[N];
10 int phi[N];
11 LL s[N];
12 
13 void get_prime(int n) {
14     // phi[1] = 1    // 这题中定义phi(1)=0
15     for (int i = 2; i <= n; i++) {
16         if (!vis[i]) primes[cnt++] = i, phi[i] = i - 1;
17         for (int j = 0; primes[j] <= n / i; j++) {
18             vis[primes[j] * i] = true;
19             if (i % primes[j] == 0) {
20                 phi[primes[j] * i] = phi[i] * primes[j];
21                 break;
22             }
23             phi[primes[j] * i] = phi[i] * (primes[j] - 1);
24         }
25     }
26 }
27 
28 int main() {
29     int n;
30     cin >> n;
31     get_prime(n);
32     for (int i = 1; i <= n; i++) {  // 对phi[i]求前缀和
33         s[i] = s[i - 1] + phi[i];
34     }
35     LL ret = 0;
36     for (int i = 0; i < cnt; i++) {
37         ret += 2 * s[n / primes[i]] + 1;
38     }
39     cout << ret;
40     
41     return 0;
42 }

 

参考资料

  AcWing 220. 最大公约数(算法提高课):https://www.acwing.com/video/695/

标签:frac,gcd,int,质数,leq,最大公约数
From: https://www.cnblogs.com/onlyblues/p/17063977.html

相关文章

  • 1819. 序列中不同最大公约数的数目(每日一题)(困难)
    1819.序列中不同最大公约数的数目(每日一题)(困难)给你一个由正整数组成的数组nums。数字序列的最大公约数定义为序列中所有整数的共有约数中的最大整数。例如,序列[4......
  • Java程序员用代码,计算最大公约数和最小公倍数
    作者:小傅哥博客:https://bugstack.cn源码:https://github.com/fuzhengwei/java-algorithms沉淀、分享、成长,让自己和他人都能有所收获!......
  • 最大公约数,最大公倍数
    例:求num1与num2的最大公约数解:使用辗转相除法1.选出最大的数比如num1最大,num2小2.用temp=num1%num2;(需要先进行一次)3.temp!=0,则num1=num2;num2=temp;  最大公倍数:......
  • 最大公约数
     一、最大公约数 1、定义:最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数......
  • 最大公约数_辗转相除法_更相减损术_原理
    辗转相除法算法使用要计算\(a\)与\(b\)的最大公约数,且\(a\÷\b=q\cdotsr\\\(a>=b)\).若\(r\not=0\),可将计算\(a\)与\(b\)的最大公约数,转为计算\(......
  • AcWing246. 区间最大公约数
    题目描述给定一个长度为\(N\)的数列\(A\),以及\(M\)条指令,每条指令可能是以下两种之一:Clrd,表示把\(A[l],A[l+1],…,A[r]\)都加上\(d\)。Qlr,表示询问\(A[l......
  • 54. 【中学】求最大公约数——递归
    54.【中学】求最大公约数——递归 请使用递归算法计算正整数n和m的最大公约数GCD(n,m)。        =m            当m<=n且nmodm......
  • 给定两个数,求这两个数的最大公约数
    1.辗转相除法,一般用来求最大公约数#include<stdio.h>intmain(){intm;intn;intr;printf("请输入两个数:");scanf("%d%d",&m,&n);while(m%n!=0){r=m%n......
  • 辗转相减法求最大公约数
    要求:用C实现一个函数intgcd(inta,intb)求解两个整数的最大公约数,算法步骤是,用a,b中的大值减去小值得到临时值c,然后再用c和a,b中的最小值进行计算,直到c和a,b中的最......
  • 辗转相除法求最大公约数
    代码#include<stdio.h>intmain(){ inta,b,r,temp; printf("Pleaseentera,b:"); scanf("%d,%d",&a,&b); if(a<b) { temp=a; a=b; b=temp; } r=a%b; ......