[AcWing 872] 最大公约数

image

欧几里得算法(辗转相除法)

复杂度 $ O(log(n)) $

总体复杂度 $ 10^{5} \times log(2 \times 10^{9}) \approx 4 \times 10^{6} $


点击查看代码
#include<iostream>

using namespace std;

int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}
int main()
{
    int n;
    scanf("%d", &n);
    while (n --) {
        int a, b;
        scanf("%d %d", &a, &b);
        printf("%d\n", gcd(a, b));
    }
    return 0;
}

  1. a, b 的最大公约数记为 \((a, \ b)\),a 能整除 b 记作 $a \mid b $;
  2. 重要性质: \((a, \ b) = (b , \ a \bmod b)\),证明如下:
    ① $ a \bmod b = a - \left \lfloor \frac a{b} \right \rfloor \cdot b = a - c \cdot b $;
    ② 如果 $ d \mid a $, $ d \mid b $,那么 $ d \mid (a \cdot x + b \cdot y) $;
    \((b , \ a \bmod b)\) = \((b , \ a - c \cdot b)\),即证 \((a, \ b) = (b , \ a - c \cdot b)\)
    从左边推右边:设 $ d $ 为 $ a, \ b $ 的任一公约数,$ d \mid a $, $ d \mid b $,则由 ② ,取 $ x = 1, \ y = -c $,可推出 $ d \mid (a - c \cdot b) $;
    从右边推左边:设 $ d $ 为 $ b, \ a - c \cdot b $ 的任一公约数, $ d \mid b $, $ d \mid (a - c \cdot b) $,则由 ②,取 $ x = c, \ y = 1 $,则 $ d \mid (c \cdot b \ + \ a - c \cdot b) $,即 $ d \mid a $;
  3. $ x \bmod 0 = x $
posted @ 2022-05-08 22:14  wKingYu  阅读(43)  评论(0)    收藏  举报