#ySybttg060303. 1627:【例 3】最大公约数

1627:【例 3】最大公约数

1627:【例 3】最大公约数

题目描述

给出两个正整数 A,BA,B,求它们的最大公约数。

输入格式

输入共两行,第一行一个正整数 AA,第二行一个正整数 BB

输出格式

在第一行输出一个整数,表示 A,BA,B 的最大公约数。

样例

样例输入 #1

18
24

样例输出 #1

6

样例解释 #1

gcd(18,24)=6\gcd(18,24) = 6

数据范围

  • 对于 60%60\% 的数据,1A,B10181 \le A,B \le 10^{18}
  • 对于 100%100\% 的数据,1A,B1030001 \le A,B \le 10^{3000}

时空限制

  • 时间限制:1000 ms
  • 内存限制:524288 KB

注意:本题中 A,BA,B 可能非常大(长达 30003000 位十进制数),因此不能直接用 long long 存储,也不能直接用欧几里得算法(因为取模运算涉及大数除法,较慢)。需要使用高精度计算最大公约数。

更相减损术(Stein算法)适用于高精度,因为它只涉及减法和位移,避免了取模运算。但单纯使用更相减损术可能较慢(例如 A=103000,B=1A=10^{3000}, B=1 需要减很多次)。结合以下性质可以加速:

  1. 如果 A,BA,B 都是偶数,则 gcd(A,B)=2gcd(A/2,B/2)\gcd(A,B) = 2 \cdot \gcd(A/2, B/2)
  2. 如果 AA 是偶数,BB 是奇数,则 gcd(A,B)=gcd(A/2,B)\gcd(A,B) = \gcd(A/2, B)
  3. 如果 A,BA,B 都是奇数,则 gcd(A,B)=gcd(AB,min(A,B))\gcd(A,B) = \gcd(|A-B|, \min(A,B))
  4. 如果 A=BA=B,则 gcd(A,B)=A\gcd(A,B) = A

这样,我们可以将高精度数表示为字符串或数组,实现高精度的除以 22(右移)、判断奇偶性、减法、比较等操作。由于 A,BA,B 可达 30003000 位,操作次数不会太多(因为每次操作都会减少数值的规模)。具体步骤:

  • 如果 A=BA=B,返回 AA
  • 如果 AABB 都是偶数,计数器 cntcnt11AABB 都除以 22
  • 否则如果 AA 是偶数,AA 除以 22
  • 否则如果 BB 是偶数,BB 除以 22
  • 否则(A,BA,B 都是奇数),如果 A>BA>B,则 A=ABA = A-B,否则 B=BAB = B-A
  • 重复直到 A=BA=B

最后返回 A×2cntA \times 2^{cnt}

注意:高精度除以 22 可以通过逐位计算实现。高精度减法需要处理借位。由于 A,BA,B 可能很大,但操作次数有限,可以通过递归或循环实现。

另外,也可以使用高精度取模的欧几里得算法,但实现较复杂。更相减损术结合移位(二进制算法)更易于实现高精度。

最后输出结果,注意结果可能很大,也要用高精度输出。