zoukankan      html  css  js  c++  java
  • 浅谈最大公约数及最小公倍数

    最大公约数及最小公倍数

    本篇随笔讲解信息学奥林匹克竞赛中的数学部分知识点——最大公约数及最小公倍数。最大公约数及最小公倍数是信竞中非常常考的数学知识点,无论是一些数学公式的推导,还是互质、欧拉函数等相关类型题,都需要最大公约数和最小公倍数的参与。本篇随笔要求读者有不低于高中一年级的数学基础及一定的思维推理能力,一些数学符号及基本概念将不再赘述。

    • GCD&LCM

    任意两正整数(a,b)的最大公约数被记作:(gcd(a,b)),最小公倍数被记作:(lcm(a,b))

    • 定理1

    对于任意的两个正整数,有以下定理

    [forall a,bin N ]

    [gcd(a,b) imes lcm(a,b)=a imes b ]

    证明过程如下:

    (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

  • 相关阅读:
    如何用redis/memcache做Mysql缓存层?
    孤儿进程和僵尸进程总结
    二叉树的遍历(非递归)
    Linux进程分配内存的两种方式--brk() 和mmap()
    Hbase
    cgroup 分析之CPU和内存部分
    十道海量数据处理面试题与十个方法大总结
    快速定位性能瓶颈,检查出所有资源(CPU、内存、磁盘IO等)的利用率(utilization)、饱和度(saturation)和错误(error)度量,即USE方法
    红黑树
    tcp 两个重要窗口:滑动窗口 和 拥塞窗口
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11454727.html
Copyright © 2011-2022 走看看