AcWing 872. 最大公约数
原题链接
简单
作者:
ZeroAC
,
2020-03-27 09:54:44
,
所有人可见
,
阅读 9798
详细证明
#include<bits/stdc++.h>
using namespace std;
/*
求两个正整数 a 和 b 的 最大公约数 d
则有 gcd(a,b) = gcd(b,a%b)
证明:
设a%b = a - k*b 其中k = a/b(向下取整)
若d是(a,b)的公约数 则知 d|a 且 d|b 则易知 d|a-k*b 故d也是(b,a%b) 的公约数
若d是(b,a%b)的公约数 则知 d|b 且 d|a-k*b 则 d|a-k*b+k*b = d|a 故而d同时整除a和b 所以d也是(a,b)的公约数
因此(a,b)的公约数集合和(b,a%b)的公约数集合相同 所以他们的最大公约数也相同 证毕#
*/
int gcd(int a, int b){
return b ? gcd(b,a%b):a;
}
int main(){
int n,a,b;
cin>>n;
while(n--) cin>>a>>b,cout<<gcd(a,b)<<endl;
return 0;
}
注意,C++中有模零操作时,会报错 【C2124 被零除或对零求模】,这也是每次操作完 a%b需要对第二个参数进行检查的原因
我想了半天为啥d|a-kb中,为啥不是d|a-d|kb,原来是答主把后面当一个整体了orz
是通过一个集合中的元素也是另一个集合的元素来证明集合相等吗srO
抽象,看不懂
看我的题解,也挺简单明了的
a mod b = a - c * b
(a,b) = (b,a - c * b)
对于a 和 b的一个公约数d,d | a ,d | b ,所以d | (a - c * b),所以左边的公约数都是右边的公约数
对于右边的公约数,d | b,d | (a - c * b) ,所以d | (a - c * b + c * b),即d | a,所以右边的公约数都是左边的公约数
请问这里
d|a-k*b 则 d|a-k*b+k*b
是为什么呢?公式:显然,若$d|a$ 且$d|b$ ,则有 $d | k_{1}\*a+k_{2}\*b$
故当 $d|a-k*b$ 且 $d|b$ 则 $ d | a-k\*b+k\*b$
明白了~感谢!
不用谢(^o^)/~