常用算法公式之取模

article/2025/10/14 8:10:41

文章目录

  • 前言
  • 求最大公约数(欧几里得算法)
  • 贝祖等式
    • 蓝桥杯:一步之遥
      • 暴搜解法
      • 贝祖解法(欧几里得)
  • 模运算(同余方程)
    • 青蛙的约会(例题)
  • 求逆元
  • 总结

前言

今天呢,我们先来简单地梳理一下咱们常用的一些数学公式,以及在咱们算法里面的运用。
例如咱们有时候求阶乘,求N项求和,那么这个时候,我们可以使用快速求法,或者直接使用数学公式例如无穷级数等,直接拿到结果。

求最大公约数(欧几里得算法)

怎么来的咱们不关心,咱们只需要知道m,n求公约数有这样的性质。
它们之间的公约数可以相互求余,值为0。

代码模板如下(这里给出java代码)

public static int gcd(int m,int n){return n==0?m:gcd(n,m%n);}

例如咱们比较经典的问题
在这里插入图片描述
问这个直线段可以分几段。这个不就是求最大公约数的题目嘛,横坐标,纵坐标同时可以分为几份,这不就是变相求公约数嘛。(别问为什么不是最小的,问就是1)

贝祖等式

说到这个,咱们先来说说这玩意是干啥的。

一个方程组 ax+by = d
求x,y的解。并且d 是 a b的最大公约数。显然x,y有无穷多个解集。

首先我们这个是有规律的,我们只需要找到其中一个解就可以找到全部解。
就例如

12x + 42y = 6

4,-1是其中一个解。那么其他的解是啥
显然我们可以发现
4+(±)(42/6) , 1+(±)(12/6)
是另一组解,只要这样搞下去就是无穷个解。

那么问题时如何找到第一组解。

这里直接说递推公式

x = y1
y = x1 -a/b * y1

这个 x1,y1是第二步运算后的

public class 贝祖公式 {static long x;static long y;static long gcd(long m,long n){return n==0?m:gcd(n,m%n);}static long lcm(long a,long b){//求最小公倍数return a*b /gcd(a,b);}static long beizu(long a,long b){if(b==0){x = 1;y = 0;return a;}long res = beizu(b,a%b);long x1 = x;x = y;y = x1-a/b*y;return res;}static long linefunction(long a,long b,long m) throws Exception{long d = beizu(a,b);if(m%d!=0) throw new Exception("无解");long n = m/d;x *=n;y *=n;return d;}
}class 贝祖test{public static void main(String[] args) throws Exception {贝祖公式.linefunction(12,42,6);System.out.println("x:"+贝祖公式.x+" "+"y:"+ 贝祖公式.y);}
}

这个拿到代码之后自己去调整,理解不了就死记,知道咋个用。

蓝桥杯:一步之遥

题目如下:

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

从昏迷中醒来,小明发现自己被关在 X 星球的废矿车里。 矿车停在平直的废弃的轨道上。 他的面前是两个按钮,分别写着 “F”“F” 和
“B”“B” 。

小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。 按 FF,会前进 9797 米。按 BB 会后退127127 米。
透过昏暗的灯光,小明看到自己前方 11 米远正好有个监控探头。 他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助。
或许,通过多次操作 FF 和 BB 可以办到。

矿车上的动力已经不太足,黄色的警示灯在默默闪烁… 每次进行 FF 或 BB 操作都会消耗一定的能量。
小明飞快地计算,至少要多少次操作,才能把矿车准确地停在前方 11 米远的地方。

请问为了达成目标,最少需要操作的次数是多少。

这题目翻译出来就是 问
97x-127y=1的最小x+y的解

当然这题也是可以暴搜的

暴搜解法

这里我就直接写个python代码 了


x = 97
y = -127
ans = 100000#随便一个贼大的数
for i in range(300):for j in range(300):if i*x + j* y==1:ans = min(ans, i+j)
print(ans)

贝祖解法(欧几里得)

这个就是直接用咱们的那个玩意求出的结果求和

在这里插入图片描述

模运算(同余方程)

一说到模运算,他有两个非常神奇的功能。

1.运用模运算可以保留数的后几位
2.运用模运算可以实现不进位加法

举个爪子
例如 6666666333保留到后面的3个3如何做
直接 6666666333%1000 即可
不进位加法就更不用说了
9+8 % 10 = 7

此外本身还有个性质
5 % 3 = 2
5%2 == 3%2
这种规律。

当然咱们还有 快速取余这种性质
快速幂乘法&快速幂取余

不过这里还有一个性质
例如 5%3 %3 %3 你会发现
5%3 = 2
2% 3=2
如果一直 % 下去 效果可能是一样的,也就是说如果第一次的余数比去取模的数小,那么后面就没必要算了。

此外关于取模我们这样写
a % b = m

实际上对应
a = n*b + m

这样就意味着我们还可以使用这种方式去解方程。
此时在看道先前的性质
5%2 == 3%2

方程可以写成这样
a x + m y = b

x , y是一个整数。这样一来我把这玩意变成了一个方程。那么这个方程叫做同余方程。

目前为止,对于解方程,如果是 ax + by =1 的求解,我们可以使用那个贝祖定理。那么对于这个同余方程,我们还能这样处理。都说了是同余方程嘛。

当然问题是遇到这样的方程,带有求余数的方程,如何转化为线性方程。只要你会转,接下来你就是直接暴力,当然不转也能暴力,只是多知道一点嘛。

青蛙的约会(例题)

两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。
Input
输入只包括一行5个整数x,y,m,n,L,其中x≠y < 2000000000,0 < m、n < 2000000000,0 < L < 2100000000。
Output
输出碰面所需要的跳跃次数,如果永远不可能碰面则输出一行"Impossible"
Sample Input
1 2 3 4 5
Sample Output
4

这里的话我们直接推方程是这样的

(x + km)%L = (y+kn)%L
然后我们展开
x + km = L* y1 + 余数
y + kn = L*y2 +余数

合并
(m-n)k + L(y1+y2) = y-x

y1+y2 变为一个未知数 t 因为他们表示的也就是时间嘛
(m-n)k + Lt = y-x

也就是这样的方程
ax + by = m
这样不就是回到了我们一开始的贝祖解法嘛

但是这里有个细节,那就是咱们对于负数的处理,这里咱们要点是x 但是x解出来可能是负数,显然我们要的是正数,那这个怎么处理咧。
这个直接套模板
我们的 那个是有返回值的那个方程里面
那么直接 b / 返回值 假设等于 c
那么 直接
x = (x%c + c) %c
下面是非暴力AC代码
自己改去
在这里插入图片描述
这个时候那可能要为我要 y 怎么办,我只能说数学是个好东西。

求逆元

这个怎么说呢,其实就是这个东西

a % b = m

a % m = b % m = 1

写出方程就是:
ax + by = 1

我看了人家的代码,其实和咱门那个代码是类似的直接用,只不过我们要注意x是负数的情况。
例如
13x == (1%5)
也就是
13x % 5 == 1%5 求出咱们x的最小值(非负的)

image.png

总结

我们今天的重点就是这个那个线性方程,只要方程里面出现这种取模运算,这种线性的方程,我们就可以想办法去转换出来


http://chatgpt.dhexx.cn/article/hJPwSJq6.shtml

相关文章

大数取模运算,快速幂取模运算

1.快速幂取模 http://www.cnblogs.com/yinger/archive/2011/06/08/2075043.html 快速幂取模就是在O(logn)内求出a^n mod b的值。算法的原理是ab mod c(a mod c)(b mod c)mod c long exp_mod(long a,long n,long b) {long t;if(n0) return 1%b;if(n1) return a%b;texp_mod(a…

关于取模运算(mod)和求余(rem)运算

通常情况下取模运算(mod)和求余(rem)运算被混为一谈&#xff0c;因为在大多数的编程语言里&#xff0c;都用’%’符号表示取模或者求余运算。在这里要提醒大家要十分注意当前环境下’%’运算符的具体意义&#xff0c;因为在有负数存在的情况下&#xff0c;两者的结果是不一样的…

模运算——神奇的9

2012/10/11 19:55 在求余运算中&#xff0c;9是个神奇的数&#xff0c;它让求余变得如此简单。 求 2468 Mod 9&#xff0c;对于2468这个数&#xff0c;可以直接计算得出结果&#xff0c;这里并不这样做&#xff0c;而是用它来引出9的神奇特性。 因为 2468 2000 400 60 8 上…

模n运算

2019独角兽企业重金招聘Python工程师标准>>> 注意:只是个人理解,可能有不正确的地方 对于整数a、n,模n运算就是求a除以n的余数 如果a=10,n=3,那么a除以n的商为3,余数为1 C语言等编程语言中常使用%代表求模运算:a%n 10%3=1 英文中也使用mod代表求模运算:a mo…

密码学-模逆运算

扩展欧几里得算法 给予二整数 a 与 b, 必存在有整数 x 与 y 使得 ax by gcd(a,b) 。 有两个数a,b&#xff0c;对它们进行辗转相除法&#xff0c;可得它们的最大公约数——这是众所周知的。然后&#xff0c;收集辗转相除法中产生的式子&#xff0c;倒回去&#xff0c;可以得…

什么是长轮询

短轮询 vs 长轮询短轮询长轮询 长轮询的原理demotomcat线程池AsyncContext源码分析 短轮询 vs 长轮询 在看apollo和nacos等配置中心的源码的时候发现&#xff0c;配置更新的实时感知都是采用的长轮询的方式。那么什么是长轮询的呢&#xff1f;在讲解长轮询之前我们先了解一下什…

js轮询

一、案例效果 使得数据实时变化&#xff0c;可以随时暂停和播放 二、代码案例 html <button id"button">暂停</button>js let timerId 1 // 模拟计时器id&#xff0c;唯一性let timerObj {} // 计时器存储器function getData() {return new Promi…

php实现异步轮询

文章目录 一、前言二、工欲善其事1、curl是伪异步请求2、鸟哥推荐的方法中有curl 三、异步轮询&#xff08;fsockopen&#xff09;1、模拟异步轮询的demo2、响应页面代码3、测试结果4、fsockopen(): unable to connect to 错误 四、问题以及反思1、无法调试返回2、占用进程3、最…

java 轮询请求_使用RxJava来实现网络请求轮询功能

原标题:使用RxJava来实现网络请求轮询功能 近日有媒体报道称,腾讯重金入股永辉超市旗下生鲜超市超级物种,目前交易已经完成。受此刺激,永辉超市股价迅速涨停,午后临时停牌。若此举成行,超级物种将更有底气对垒阿里巴巴的盒马鲜生,生鲜商超的新零售市场将展开激烈争战。 …

android轮询

目录 轮询实现方案&#xff1a; Timer Handler RxJava 1.Interval 2.repeatWhen 轮询实现方案&#xff1a; 方案一&#xff1a; Timer Thread 实现思路&#xff1a;使用timer定时执行TimerTask 缺点&#xff1a;如果有异步任务&#xff0c;下次任务开始执行时需要判断…

nginx轮询

创建容器1&#xff1a; docker create -it --name zyr1 centos:7 /bin/bash docker start zyr1 进入容器&#xff1a; docker exec -it zyr1 /bin/bash 安装ipconfig命令 yum provides ifconfig 安装nginx依赖 yum -y install openssl openssl-devel prce-devel zlib z…

python 轮询mysql_python 轮询

1. 轮询 三天之后,小钱才拿到这个快递 总结 快递不能及时的传达 小钱儿 - 卒 客户端浪费极大资源 老程头儿 -痴呆 资源浪费也很严重 HTTP无法跟踪定义客户端 无状态 2. 长轮询 缺陷: 消息实时性不高 传达室茶室的资源有限 占用资源 客户端线程资源占用 3. 长连接 总结 占用的空…

java 轮询http_HTTP轮询模型

HTTP轮询模型 长短轮询 http协议是一种client-server模型的应用层协议&#xff0c;这种c-s的模式虽然大多数情况都能满足需求&#xff0c;但是某些场景也需要服务端能够将一些信息实时的推送到客户端&#xff0c;即实现服务器向客户端推消息的功能。 比如&#xff1a; 配置管理…

七种轮询介绍(后附实践链接)

我有一个朋友&#xff5e; 做了一个小破站&#xff0c;现在要实现一个站内信web消息推送的功能&#xff0c;对&#xff0c;就是下图这个小红点&#xff0c;一个很常用的功能。 不过他还没想好用什么方式做&#xff0c;这里我帮他整理了一下几种方案&#xff0c;并简单做了实现…

linux cgroup 死循环,Linux CGroup 基础

CGroup V1 1. CGroup 概念Task: 任务&#xff0c;也就是进程&#xff0c;但这里的进程和我们通常意义上的 OS 进程有些区别&#xff0c;在后面会提到。 CGroup: 控制组&#xff0c;一个 CGroup 就是一组按照某种标准划分的Tasks。这里的标准就是 Subsystem 配置。换句话说&…

linux cgroup 原理,Cgroup框架的实现

CGoup核心主要创建一系列sysfs文件&#xff0c;用户空间可以通过这些节点控制CGroup各子系统行为&#xff0c;以及各子系统模块根据参数。在执行过程中或调度进程到不同CPU上&#xff0c;或控制CPU占用时间&#xff0c;或控制IO带宽等等。另外&#xff0c;在每个系统的proc文件…

CGroup的原理和使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、主要功能二、基本概念三、cgroups子系统介绍四、cgroups 层级结构五、数据结构 前言 Linux CGroup全称Linux Control Group&#xff0c; 是Linux内核的一个…

Linux cgroup介绍

本文参考网上一些资料&#xff0c;结合实际应用&#xff0c;简要介绍一下cgroup。 为什么要有cgroup Linux系统中经常有个需求就是希望能限制某个或者某些进程的分配资源。也就是能完成一组容器的概念&#xff0c;在这个容器中&#xff0c;有分配好的特定比例的cpu时间&#…

漫谈cgroup

什么是cgroup cgroup 是linux内核的一个功能&#xff0c;用来限制、控制与分离一个进程组的资源&#xff08;如CPU、内存、磁盘I/O等&#xff09;。它是由 Google 的两位工程师进行开发的&#xff0c;自 2008 年 1 月正式发布的 Linux 内核 v2.6.24 开始提供此能力。 cgroup …

容器中的Cgroup

文章目录 容器中的CgroupCgroup概念容器化两个关键核心现代容器化带来的优势什么是Cgroup Cgroup的一些测试测试CPU和内存使用情况CPU 周期限制 CPU Core 控制CPU 配额控制参数的混合使用内存限额Block IO 的限制bps 和 iops的限制 容器中的Cgroup Cgroup概念 容器化两个关键…