最大公约数及最小公倍数
本篇随笔讲解信息学奥林匹克竞赛中的数学部分知识点——最大公约数及最小公倍数。最大公约数及最小公倍数是信竞中非常常考的数学知识点,无论是一些数学公式的推导,还是互质、欧拉函数等相关类型题,都需要最大公约数和最小公倍数的参与。本篇随笔要求读者有不低于高中一年级的数学基础及一定的思维推理能力,一些数学符号及基本概念将不再赘述。
-
GCD&LCM
任意两正整数(a,b)的最大公约数被记作:(gcd(a,b)),最小公倍数被记作:(lcm(a,b))。
-
定理1
对于任意的两个正整数,有以下定理
证明过程如下:
设(x=gcd(a,b)),
那么有(a_0=a/x,b_0=b/x)
所以,(gcd(a_0,b_0)=1,lcm(a_0,b_0)=a_0 imes b_0)。
注:这里的跳转很简单,因为如果两个数被“抽走”了它们的最大公约数,那么剩下的那部分数字一定是互质的,那么这两个剩下的数的(gcd)就一定得1,(lcm)一定得两个数的乘积。
所以有(lcm(a,b)=lcm(a_0 imes x,b_0 imes x)=x imes lcm(a_0,b_0)=a_0 imes b_0 imes x)。
所以,(lcm(a,b)=a imes b/x)。
注:这里的跳转也很好理解:我们知道(a_0 imes x=a),同理,(b_0 imes x=b)。所以,上式(a_0 imes b_0 imes x),我们考虑在它身上同时乘以再除以一个(x),就推出了下一个式子。
然后就得出了结论:(gcd(a,b) imes lcm(a,b)=a imes b)。
个人认为以上证明过程没什么用,结论记住就好
-
求最大公约数的两种方法
这个是一个比较大的课题,我之前有一篇专门的博客讲解这个知识点,请各位看官移步此处:
注:其中辗转相除法也叫欧几里得算法。
-
求最小公倍数的方法
求最小公倍数的算法就是公式法。
根据我们上面提到的关于最大公约数和最小公倍数的定理1,我们可以发现:最小公倍数就是它们的乘积再除以最大公约数。
代码实现大约是这样:
int lcm(int x,int y)
{
return (x*y)/gcd(x,y);
}
注意什么时候要开long long