#lydlx03x0B10. 最大公约数 GCD

最大公约数 GCD

素数最大公约数对

题目描述

给定整数 NN,求 1x,yN1 \le x, y \le NGCD(x,y)\text{GCD}(x,y) 为素数的数对 (x,y)(x,y) 有多少对。

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

输入格式

输入一个整数 NN

输出格式

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

数据范围

1N1071 \le N \le 10^7

输入样例

4

输出样例

4

样例解释

对于 N=4N = 4,满足条件的数对 (x,y)(x,y) 有:

  1. (2,2)(2, 2)GCD(2,2)=2\text{GCD}(2,2) = 2(素数)
  2. (2,4)(2, 4)GCD(2,4)=2\text{GCD}(2,4) = 2(素数)
  3. (3,3)(3, 3)GCD(3,3)=3\text{GCD}(3,3) = 3(素数)
  4. (4,2)(4, 2)GCD(4,2)=2\text{GCD}(4,2) = 2(素数)

注意:

  • (1,1)(1, 1) 不满足,因为 GCD(1,1)=1\text{GCD}(1,1) = 1 不是素数
  • (1,2)(1, 2) 不满足,因为 GCD(1,2)=1\text{GCD}(1,2) = 1 不是素数
  • (1,3)(1, 3) 不满足,因为 GCD(1,3)=1\text{GCD}(1,3) = 1 不是素数
  • (1,4)(1, 4) 不满足,因为 GCD(1,4)=1\text{GCD}(1,4) = 1 不是素数
  • (2,3)(2, 3) 不满足,因为 GCD(2,3)=1\text{GCD}(2,3) = 1 不是素数
  • (3,4)(3, 4) 不满足,因为 GCD(3,4)=1\text{GCD}(3,4) = 1 不是素数
  • (4,4)(4, 4) 不满足,因为 GCD(4,4)=4\text{GCD}(4,4) = 4 不是素数

所以总共有 4 对,输出 4

问题分析

我们需要统计有多少对 (x,y)(x,y) 满足 1x,yN1 \le x, y \le NGCD(x,y)\text{GCD}(x,y) 是素数。

关键转化

d=GCD(x,y)d = \text{GCD}(x,y),且 dd 是素数 pp

那么 x=pxx = p \cdot x'y=pyy = p \cdot y',其中 GCD(x,y)=1\text{GCD}(x', y') = 1

约束条件:

  1. 1xN1 \le x \le N1pxN1 \le p \cdot x' \le N1xN/p1 \le x' \le \lfloor N/p \rfloor
  2. 1yN1 \le y \le N1pyN1 \le p \cdot y' \le N1yN/p1 \le y' \le \lfloor N/p \rfloor
  3. GCD(x,y)=1\text{GCD}(x', y') = 1

数学形式

对于每个素数 pNp \le N,我们需要计算:

$$\sum_{x'=1}^{\lfloor N/p \rfloor} \sum_{y'=1}^{\lfloor N/p \rfloor} [\text{GCD}(x', y') = 1]$$

其中 [][\cdot] 是艾弗森括号,条件成立时值为1,否则为0。

欧拉函数关系

我们知道:

$$\sum_{i=1}^{n} \sum_{j=1}^{n} [\text{GCD}(i,j) = 1] = 2 \cdot \sum_{i=1}^{n} \varphi(i) - 1$$

其中 φ(i)\varphi(i) 是欧拉函数,表示 1ki1 \le k \le i 中与 ii 互质的数的个数。

推导:

  • i=ji = j 时:[GCD(i,i)=1]=1[\text{GCD}(i,i)=1] = 1 当且仅当 i=1i=1,所以这部分贡献为 1
  • iji \ne j 时:对于每个 ii,与 ii 互质的 jjφ(i)\varphi(i) 个,对称计算两次

因此:

$$\text{总数} = \sum_{i=1}^{n} \varphi(i) \times 2 - 1 = 2 \cdot \sum_{i=1}^{n} \varphi(i) - 1$$

最终公式

S(n)=2i=1nφ(i)1S(n) = 2 \cdot \sum_{i=1}^{n} \varphi(i) - 1,则答案为:

$$\text{答案} = \sum_{\text{素数 } p \le N} S\left(\left\lfloor \frac{N}{p} \right\rfloor\right)$$

算法步骤

  1. 筛法求素数:使用线性筛或埃氏筛求出所有 N\le N 的素数
  2. 计算欧拉函数前缀和:使用线性筛计算 φ(i)\varphi(i) 并求前缀和
  3. 计算答案:对于每个素数 pNp \le N,累加 S(N/p)S(\lfloor N/p \rfloor)

时间复杂度

  • 筛法:O(N)O(N)
  • 计算答案:O(π(N))O(\pi(N)),其中 π(N)\pi(N)N\le N 的素数个数,约为 N/lnNN/\ln N

总时间复杂度 O(N)O(N),可以处理 N107N \le 10^7

示例计算(N=4)

  1. 素数 4\le 42,32, 3

  2. 计算欧拉函数:

    • φ(1)=1\varphi(1) = 1
    • φ(2)=1\varphi(2) = 1
    • φ(3)=2\varphi(3) = 2
    • φ(4)=2\varphi(4) = 2
    • 前缀和:1,2,4,61, 2, 4, 6
  3. 对于 p=2p=24/2=2\lfloor 4/2 \rfloor = 2

    • S(2)=2×(1+1)1=2×21=3S(2) = 2 \times (1+1) - 1 = 2 \times 2 - 1 = 3
  4. 对于 p=3p=34/3=1\lfloor 4/3 \rfloor = 1

    • S(1)=2×11=1S(1) = 2 \times 1 - 1 = 1
  5. 总答案:3+1=43 + 1 = 4

注意事项

  1. 结果可能很大,需要使用 long long 类型
  2. 线性筛可以同时求出素数和欧拉函数
  3. 前缀和可以避免重复计算

时空限制

  • 时间限制:1秒
  • 空间限制:64MB