GCD和LCM学习指南
典题合集
前置芝士
约数
约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。
倍数
一个整数能够被另一个整数整除,这个整数就是另一整数的倍数。
最小公倍数和最大公约数的联系
设\(a=p_{1}^{ka_{1}}p_{2}^{ka_{2}}\cdots p_{s}^{ka_{8}},b=p_{1}^{kb_{1}}p_{2}^{kb_{2}}\cdots p_{s}^{kb_{8}}\)
则对于a和b的情况,二者的最大公约数等于\(p_1^{\min(k_{a_1},kb_1)}p_2^{\min(k_{a_2},kb_2)}\cdots p_s^{\min(k_{a_s},kb_s)}\)。
最小公倍数等于\(p_1^{\max(k_{a_1},k_{b_1})}p_2^{\max(k_{a_2},k_{b_2})}\cdots p_s^{\max(k_{a_s},k_{b_s})}\)。
由于\(k_a+k_b=\max(k_a,k_b)+\min(k_a,k_b)\),所以可以得到结论:\(\gcd(a,b)\times\operatorname{lcm}(a,b)=a\times b\),即lcm(a,b)=a / gcd(a,b) * b。
要求两个数的最小公倍数,可以先求最大公约数。
求两数最大公约数
欧几里得算法
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
朴素辗转相减法
def gcd(a, b):
while b != 0:
if a > b:
a = a - b
else:
b = b - a
return a