算法(三)——最大公约数、最小公倍数、同余原理

ops/2025/3/3 4:14:18/

文章目录

  • 最大公约数、最小公倍数、同余原理
    • 最大公约数
    • 最小公倍数
    • 同余原理

最大公约数、最小公倍数、同余原理

最大公约数

最大公约数的计算可以采用 欧几里得算法(辗转相除法),基本思想是:两个整数的最大公约数等于其中较小的数和两数相除的余数的最大公约数。这个过程一直重复,直到余数为0,此时的除数就是最大公约数

代码样例:

    public static long gcd(long a, long b) {return b == 0 ? a : gcd(b, a % b);}

最小公倍数

在求得最大公约数的基础上,可以很容易地求出最小公倍数,代码如下:

    public static long lcm(long a, long b) {return a * b / gcd(a, b);}

【经典例题】

原题链接:878. 第 N 个神奇数字 - 力扣(LeetCode)

在这里插入图片描述


根据题目要求,神奇数字是一个正整数,因此要从 1 开始考虑。以示例二为例,要求求出第4个神奇数字,从1开始,2能被2整除是第一个神奇数字,3能被3整除是第二个神奇数字,4能被2整除是第三个神奇数字,5不是神奇数字,6既能被2整除也能被3整除因此是第四个神奇数字,答案是6。

由于参数的随机性,我们每次都要从1开始考虑,范围太大了,因此我们考虑缩小范围:第 n 个神奇数字的范围:[1, min(a, b) * n],因为能被 a 整除 或者 能被 b 整除的数一定是神奇数字,所以范围的上界可以缩小到 a 和 b 较小值的 n 倍。

确定的范围是有序的,考虑二分加快效率,二分依据什么? 考虑[1, min(a, b) * n]区间内的一个数num,我们能否得到[1, num]范围内有几个神奇数字?如果能够求出,我们就可以在[1, min(a, b) * n]区间二分,每次判断中间值num(num其实就是每次二分求得的mid)[1, num]范围内有几个神奇的数字,与n对比:如果比n小,说明[1, num]范围内不会出现第n个神奇数字,要在(num, right]寻找;如果比n大或者等于n说明[1, num]中包含第n个神奇的数字。(注意:等于的情况下,num的值不一定是第n个神奇的数字,例如:当n = 3;a = 6;b = 4时,第n个神奇的数字应该是8,但是对于数字num = 9,也满足[1, num]范围内的神奇数字等于n ,我们必须找到大于或等于 n 的最小的 num)。

那么,如何求[1, num]范围内有几个神奇数字呢?

  • 数量count = num / a + num / b - num / a和b的最小公倍数,即范围内能被a整除的数量 + 范围内能被b整除的数量 - 重复计算的数量(范围内能被a和b的最小公倍数整除的数量)

【代码实现】

class Solution {public int nthMagicalNumber(int n, int a, int b) {long l = 1;long r = Math.min(a, b) * (long) n;long ret = 0;long lcmNum = lcm(a, b);while(l <= r) {long m = (l + r) / 2;long count = m / a + m / b - m / lcmNum;if(count >= n) {ret = m;r = m - 1;}else {l = m + 1;}}return (int) (ret % 1000000007);}private static long gcd(long a, long b) {return b == 0 ? a : gcd(b, a % b);}private static long lcm(long a, long b) {return a * b / gcd(a, b);}
}
  • 使用1000000007而非(long) (10e9 + 7),这会导致类型转换和精度问题。

同余原理

我们这里言简意赅,介绍一下算法中同余原理的常见应用场景以及常用结论:

  1. 应用场景

    • 避免大数运算:在算法竞赛中,经常需要处理非常大的数。直接对大数进行运算可能会导致溢出或计算效率低下。同余原理允许我们在计算过程中不断取模,将大数问题转化为小数问题,从而避免溢出并提高计算效率。
    • 数论问题:许多算法竞赛题目涉及数论,如最大公约数、最小公倍数、素数判定等。同余原理是解决这些数论问题的基础工具。
  2. 常用结论

    • 加法同余原理多个数的和对一个数取模得到的余数,等于每个数对相同的数取模得到的余数相加后再对这个数取模。

      (a + b) % mod = (a % mod + b % mod) % mod

    • 乘法同余原理多个数的乘积对一个数取模得到的余数,等于每个数对相同的数取模得到的余数的乘积再对这个数取模。

      (a * b) % mod = (a % mod * b % mod) % mod

    • 减法同余原理多个数的差对一个数取模得到的余数,等于每个数对相同的数取模得到的余数的差,再加上模数后再对这个数取模。

      (a - b) % mod = (a % mod - b % mod + mod) % mod


简单说明

  • 三种同余原理的右边部分再次% mod是为了确保最终的余数在0 ~ mod - 1的范围内

  • 对于减法同余原理,再次+ mod是为了避免结果为负数,因为题目一般要求得到非负结果

  • 注意两个操作数ab相加和相乘的结果可能溢出int,因此我们要强制类型转换为long,取模后再转换为int

    例如:int ret = (int) (((long) a * b) % mod)

  • 总之,如果要求返回一个复杂表达式的结果取模后的非负结果,并且表达式的操作数是大数,此时我们就可以利用同余定理化简计算。



http://www.ppmy.cn/ops/162675.html

相关文章

【蓝桥杯】每天一题,理解逻辑(1/90)【Leetcode 移动零】

文章目录 题目解析讲解算法原理【双指针算法思路】(数组下标充当指针)如何划分和执行过程大致 代码详情 题目解析 题目链接&#xff1a;https://leetcode.cn/problems/move-zeroes/description/ 题目意思解析 把所有的零移动到数组的末尾保持非零元素的相对顺序 理解了这两层…

Django模型管理器/QuerySet 常见的方法

模型管理器/QuerySet 常见的方法 get([**kwargs]) 方法 用途&#xff1a;获取满足条件的唯一对象。参数&#xff1a;关键字参数&#xff0c;指定查询条件。返回值&#xff1a;模型对象。异常&#xff1a;如果找到多个对象或未找到对象&#xff0c;将分别抛出 MultipleObjects…

vue图表插件ECharts使用指南

以下是一份较为全面的 ECharts 使用指南&#xff0c;包含安装、基本使用步骤、常见图表示例以及配置项说明等内容。 1. 安装 ECharts 可以通过 npm 或 yarn 进行安装&#xff0c;在项目根目录下执行以下命令&#xff1a; # 使用 npm 安装 npm install echarts --save# 使用 …

浅显易懂HashMap的数据结构

HashMap 就像一个大仓库&#xff0c;里面有很多小柜子&#xff08;数组&#xff09;&#xff0c;每个小柜子可以挂一串链条&#xff08;链表&#xff09;&#xff0c;链条太长的时候会变成更高级的架子&#xff08;红黑树&#xff09;。下面用超简单的例子解释&#xff1a; ​壹…

机器翻译与语音识别技术:推动人机交互的新篇章

在数字化时代&#xff0c;语言不仅是人类交流的基本工具&#xff0c;也是连接不同文化和国家的桥梁。随着科技的飞速发展&#xff0c;机器翻译与语音识别技术作为语言处理领域的两大核心技术&#xff0c;正逐步改变着人类与计算机之间的交互方式。本文将深入探讨这两种技术的原…

PXE批量网络装机与Kickstart自动化安装工具

目录 一、系统装机的原理 1.1、系统装机方式 1.2、系统安装过程 二、PXE批量网络装机 2.1、PXE实现原理 2.2、搭建PXE实际案例 2.2.1、安装必要软件 2.2.2、搭建DHCP服务器 2.2.3、搭建TFTP服务器 2.2.4、挂载镜像并拷贝引导文件到tftp服务启动引导文件夹下 2.2.5、编…

【MySQL】InnoDB中的Buffer Pool

目录 1、背景2、Buffer Pool【1】含义【2】组成【3】free链表【4】哈希查找缓存页【5】flush链表【6】LRU链表【7】刷新脏页到磁盘【8】Buffer Pool实例【9】chunk【10】Buffer Pool状态信息 3、总结 1、背景 mysql数据是存储在磁盘上的&#xff0c;但是从磁盘上读取数据的速度…

1分钟用DeepSeek编写一个PDF转Word软件

一、引言 如今&#xff0c;在线工具的普及让PDF转Word成为了一个常见需求&#xff0c;常见的pdf转word工具有收费的wps&#xff0c;免费的有pdfgear&#xff0c;见下文&#xff1a; PDFgear:一款免费的PDF编辑、格式转化软件-CSDN博客 还有网上在线的免费pdf转word工具smallp…