
欧几里得算法(辗转相除法)
复杂度 $ 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;
}
- a, b 的最大公约数记为 \((a, \ b)\),a 能整除 b 记作 $a \mid b $;
- 重要性质: \((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 $;
- $ x \bmod 0 = x $