众所周知,beatsaber是一个yxc巨佬喜爱的VR游戏。
(大佬:烂人你怎么又开始扯游戏了
好了好了一会大家就知道了。
其实朴素欧几里得算法最大的用途就是:
这里要先介绍一点点小东西:
a × b ( a , b ) = [ a , b ] \displaystyle \frac {a \times b} {(a, b)} = [a, b] (a,b)a×b=[a,b]
简明一点,就是:
a × b ÷ a 与 b 的 最 大 公 约 数 = a 与 b 的 最 小 公 倍 数 a \times b \div {a与b的最大公约数} = {a与b的最小公倍数} a×b÷a与b的最大公约数=a与b的最小公倍数
证明如下:
令 d = ( A , B ) ; 则 a = A d b = B d ( a , b ) = 1 可 列 出 短 除 : d ∣ A , B ⋅ ⋅ — — ⋅ ⋅ a , b ( M a r k d o w n 并 没 有 短 除 功 能 此 时 把 A 与 B 分 解 质 因 数 : A = p 1 α 1 × p 2 α 2 × p 3 α 3 × ⋯ B = q 1 β 1 × q 2 β 2 × q 3 β 3 × ⋯ d 必 然 包 含 在 其 中 一 个 因 子 里 , 不 妨 设 : d = p x α x = q y β y ∵ d = p x α x = q y β y ∴ a = A ÷ p x α x , b = B ÷ q y β y 所 以 可 以 推 出 : [ A , B ] = a × b ( a , b ) 令d = (A, B);\\ 则 \displaystyle a = \frac Ad\\ \displaystyle b = \frac Bd\\ (a, b) = 1\\ 可列出短除:\\ d|A, B\\ ··——\\ ··a, b\\ (Markdown并没有短除功能\\ 此时把A与B分解质因数:\\ A = p_1 ^ {\alpha_1} \times p_2 ^ {\alpha_2} \times p_3 ^ {\alpha_3} \times \cdots\\ B = q_1 ^ {\beta_1} \times q_2 ^ {\beta_2} \times q_3 ^ {\beta_3} \times \cdots \\ d必然包含在其中一个因子里,\\ 不妨设:\\ d = p_x ^ {\alpha_x} = q_y ^ {\beta_y}\\ \because d = p_x ^ {\alpha_x} = q_y ^ {\beta_y}\\ \therefore a = A \div p_x ^ {\alpha_x}, b = B \div q_y ^ {\beta_y}\\ 所以可以推出:\\ [A, B] = \frac{a \times b}{(a, b)} 令d=(A,B);则a=dAb=dB(a,b)=1可列出短除:d∣A,B⋅⋅——⋅⋅a,b(Markdown并没有短除功能此时把A与B分解质因数:A=p1α1×p2α2×p3α3×⋯B=q1β1×q2β2×q3β3×⋯d必然包含在其中一个因子里,不妨设:d=pxαx=qyβy∵d=pxαx=qyβy∴a=A÷pxαx,b=B÷qyβy所以可以推出:[A,B]=(a,b)a×b
好我们继续。
朴素欧几里得算法是如何求出来的呢?
请看下面的流程图。
那我们如何理解这个return gcd(b, a % b)
呢?
这就是小学奥数中的辗转相除法了。
具体证明可以参考百度百科,这里提供一版y总的证明。
令 d = g c d ( a , b ) ; ∵ d = g c d ( a , b ) ; ∴ d m o d a ≡ 0 d m o d b ≡ 0 ∴ d m o d a × x + b × y ≡ 0 ∵ d m o d a × x + b × y ≡ 0 ∴ g c d ( a , b ) = g c d ( b , a − c × b ) ; ∵ d m o d a ≡ 0 ∴ g c d ( a , b ) = g c d ( b , a m o d b ) ; 证 毕 。 令d = gcd(a, b);\\ \because d = gcd(a, b);\\ \therefore \\ d \mod a \equiv 0 \\ d \mod b \equiv 0\\ \\ \therefore d \mod a \times x + b \times y \equiv 0\\ \because d \mod a \times x + b \times y \equiv 0\\ \therefore gcd(a, b) = gcd(b, a - c \times b);\\ \because d \mod a \equiv 0\\ \therefore gcd(a, b) = gcd(b, a \mod b); \\ 证毕。\\ 令d=gcd(a,b);∵d=gcd(a,b);∴dmoda≡0dmodb≡0∴dmoda×x+b×y≡0∵dmoda×x+b×y≡0∴gcd(a,b)=gcd(b,a−c×b);∵dmoda≡0∴gcd(a,b)=gcd(b,amodb);证毕。
其实证明一套套,代码就3行。
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
……
题目在此
给定n对正整数ai,bi,请你求出每对数的最大公约数。
输入格式
第一行包含整数n。
接下来n行,每行包含一个整数对ai,bi。
输出格式
输出共n行,每行输出一个整数对的最大公约数。
数据范围
1 ≤ n ≤ 1 0 5 , 1 ≤ a [ i ] , b [ i ] ≤ 2 ∗ 1 0 9 1≤n≤10^5,\\ 1≤a[i],b[i]≤2∗10^9\\ 1≤n≤105,1≤a[i],b[i]≤2∗109
输入样例:
2
3 6
4 6
输出样例:
3
2
本题需要加上输入输出。
按照顺序输出gcd就行了。
#include
using namespace std;
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int main()
{
int n;
cin >> n;
while(n --)
{
int a, b;
cin >> a >> b;
cout << gcd(a, b) <