【算法学习笔记】35:扩展欧几里得算法求解线性同余方程
线性同余方程问题
线程同余方程问题是指 a x ≡ b ( m o d m ) ax \equiv b~(mod~m) ax≡b (mod m),给定 a a a、 b b b和 m m m,找到一个整数 x x x使得该方程成立,即使得 a x m o d m = b ax~mod~m=b ax mod m=b,随便返回任何一个解都可以。
例如 4 x ≡ 3 ( m o d 5 ) 4x \equiv 3~(mod~5) 4x≡3 (mod 5),那么 x x x的一个可能的解可以是 2 2 2。
接下来用扩展欧几里得算法尝试构造这个解。从 a x ≡ b ( m o d m ) ax \equiv b~(mod~m) ax≡b (mod m)可知,一定存在一个 y y y使得:
a ⋅ x = m ⋅ y + b a \cdot x = m \cdot y + b a⋅x=m⋅y+b
也就是说,因为 a x ax ax模 m m m的余数是 b b b,所以 a x ax ax一定可以表示成 m m m的整数 y y y倍再加上一个 b b b。也就是:
a x − m y = b ax - my = b ax−my=b
令 y ′ = y y' = y y′=y,那么就是:
a x + m y ′ = b ax + my' = b ax+my′=b
因此原线性同余方程问题求 x x x有解,等价于这个方程求 x x x和 y ′ y' y′有解。而根据扩展欧几里得算法里所讨论的, a a a是 g c d ( a , m ) gcd(a,~m) gcd(a, m)的倍数, m m m也是 g c d ( a , m ) gcd(a,~m) gcd(a, m)的倍数,所以它们拼到一起也必须是 g c d ( a , m ) gcd(a,~m) gcd(a, m)的倍数。
因此,这个方程有解的充要条件是 b b b必须是 g c d ( a , m ) gcd(a,~m) gcd(a, m)的倍数,也即 g c d ( a , m ) ∣ b gcd(a,~m)~|~b gcd(a, m) ∣ b 。
例题:AcWing 878. 线性同余方程
这题最终结果要限制在int范围内,因为 m m m也是在int范围内的,并且:
a x + m y = b ⇔ a ( k m + r ) + m y = b ⇔ a r + m ( a k + y ) = b ax + my =b \\ \Leftrightarrow a(km + r) + my = b \\ \Leftrightarrow ar + m(ak + y) = b ax+my=b⇔a(km+r)+my=b⇔ar+m(ak+y)=b
也就是说,把系数 x x x变成 r = x m o d m r = x~mod~m r=x mod m时,另一个系数只要从 y y y变成 a k + y ak+y ak+y就可以了,其中 k = ⌊ x m ⌋ k = \lfloor \frac{x}{m} \rfloor k=⌊mx⌋。
所以可以直接把结果 x x x模 m m m,一定也是一个合法的解,并且满足在int范围内的要求。
#include <iostream>using namespace std;typedef long long LL;int exgcd(int a, int b, int& x, int& y) {if (!b) {x = 1, y = 0;return a;}int d = exgcd(b, a % b, y, x);// d = b * y + (a % b) * x = b * y + (a - a / b * b) * x// = a * x + b * (y - a / b * x)y -= a / b * x;return d;
}int main() {int t; cin >> t;while (t -- ) {int a, b, m; cin >> a >> b >> m;// ax % m = b, ax + my' = b, iff gcd(a, m) = d | bint x, y;int d = exgcd(a, m, x, y);if (b % d) puts("impossible");else cout << (LL)x * (b / d) % m << endl;}return 0;
}
相关文章:
【算法学习笔记】35:扩展欧几里得算法求解线性同余方程
线性同余方程问题 线程同余方程问题是指 a x ≡ b ( m o d m ) ax \equiv b~(mod~m) ax≡b (mod m),给定 a a a、 b b b和 m m m,找到一个整数 x x x使得该方程成立,即使得 a x m o d m b ax~mod~mb ax mod mb,随便返回任何一个…...
线性规划:机器学习中的优化利器
一、线性规划的基本概念 线性规划(Linear Programming, LP)是运筹学中数学规划的一个重要分支,用于在一组线性不等式的约束条件下,找到线性目标函数的最大值或最小值。其问题可以表述为: 在一组线性约束条件 s.t.&am…...
Ubuntu开发中的问题
1.退出anaconda指令:conda deactivate 2.Linux系列:一打开终端就默认进入conda的base环境,取消方法 在终端输入conda config --show,会显示所有的配置信息,然后利用conda config --set来修改此配置: conda config --se…...
MAC 地址转换为标准大写格式
// ConvertToStandardMac 将 MAC 地址转换为标准格式,确保每个字节都是两位,并且字母是大写的 func ConvertToStandardMac(mac string) (string, error) { // 分割 MAC 地址的每一部分 parts : strings.Split(mac, ":") // 确保每部分是两…...
使用插件SlideVerify实现滑块验证
作者gitee地址:https://gitee.com/monoplasty/vue-monoplasty-slide-verify 使用步骤: 1、安装插件 npm install --save vue-monoplasty-slide-verify 2、在main.js中进行配置 import SlideVerify from vue-monoplasty-slide-verify; Vue.use(SlideV…...
深入探索 Nginx 的高级用法:解锁 Web 服务器的强大潜能
在当下互联网技术飞速发展的浪潮中,Nginx 凭借其轻量级、高性能的特性,在 Web 服务器和反向代理服务器领域脱颖而出,成为众多开发者和运维工程师的得力工具。它不仅能高效处理静态资源,在负载均衡、反向代理等方面也表现出色。然而…...
(01)搭建开发环境
1.安装虚拟机软件 VMware Workstation Pro 17 2.虚拟机安装ubuntu20.4系统 3.安装VMtools工具 4.安装vim编辑器 sudo apt install vim 4.安装SSH服务 选择下载源为:http://mirrors.aliyun.com/ubuntu在线安装:sudo apt-get install openssh-serv…...
Win11桌面右键刷新选项在二级界面的修正方法
win10已经被弃用了,现在的win11在桌面右键时,“刷新”按钮在二级界面。除此以外,在资源管理器中浏览文件的时候,很多其他选项也都被放在了二级界面,非常不方便。接下来介绍一个把右键菜单栏中的所有选项都显示在一级界…...
配电室防静电地板通常用哪种
配电室是指带有低压负荷的室内配电场所,包含变压器、配电柜、开关设备等,主要为低压用户配送电能。为防止设备故障、避免火灾爆炸、保护人员安全等均会安装防静电地板。那么配电室防静电地板通常用哪种? 一、全钢防静电地板 1. 全钢三聚氰胺…...
【重庆市乡镇界】面图层shp格式arcgis数据乡镇名称和编码wgs84坐标无偏移内容测评
标题中的“最新重庆市乡镇界面图层shp格式arcgis数据乡镇名称和编码wgs84坐标无偏移最新”指的是一个地理信息系统(GIS)的数据集,特别设计用于ArcGIS软件。这个数据集包含了重庆市所有乡镇的边界信息,以Shapefile(.shp…...
68,[8] BUUCTF WEB [RoarCTF 2019]Simple Upload(未写完)
<?php // 声明命名空间,遵循 PSR-4 自动加载规范,命名空间为 Home\Controller namespace Home\Controller;// 导入 Think\Controller 类,以便扩展该类 use Think\Controller;// 定义 IndexController 类,继承自 Think\Control…...
Windows电脑桌面记录日程安排的提醒软件
在快节奏的现代生活中,工作效率成为了衡量个人能力的重要标准之一。然而,日常办公中常常会遇到各种琐事和任务,如果没有合理安排日程,很容易陷入混乱,导致效率低下。因此,做好日程安排对于日常工作至关重要…...
TiDB与Oracle:数据库之争,谁能更胜一筹?
TiDB与Oracle:数据库之争,谁能更胜一筹? 最近有很多朋友在讨论数据库的选择问题,尤其是在面对大数据、分布式系统时。作为两款在企业级数据库中非常受欢迎的产品,TiDB和Oracle常常被拿来对比。TiDB 是一款开源分布式数…...
USART_串口通讯中断案例(HAL库实现)
引言 本次,继续对前面寄存器实现的串口通讯中断案例使用HAL库进行二次实现,因此这里会省略一些重复内容,如果大家不清楚的话请参考下面链接:USART_串口通讯中断案例(一)(寄存器实现)…...
【MySQL】存储引擎有哪些?区别是什么?
频率难度60%⭐⭐⭐⭐ 这个问题其实难度并不是很大,只是涉及到的相关知识比较繁杂,比如事务、锁机制等等,都和存储引擎有关系。有时还会根据场景选择不同的存储引擎。 下面笔者将会根据几个部分尽可能地讲清楚 MySQL 中的存储引擎࿰…...
[OpenGL]实现屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO)
一、简介 本文介绍了 屏幕空间环境光遮蔽(Screen-Space Ambient Occlusion, SSAO) 的基本概念,实现流程和简单的代码实现。实现 SSAO 时使用到了 OpenGL 中的延迟着色 (Deferred shading)技术。 按照本文代码实现后,可以实现以下…...
linux-NFS网络共享存储服务配置
1.NFS服务原理 NFS会经常用到,用于在网络上共享存储,这样讲,你对NFS可能不太了解,举一个例子, 加入有三台机器A,B,C,它们需要访问同一个目录,目录中都是图片,传统的做法是把这些 图…...
w-form-select.vue(自定义下拉框组件)
文章目录 1、w-form-select.vue 组件中每个属性的含义2、实例3、源代码 1、w-form-select.vue 组件中每个属性的含义 好的,我们来详细解释 w-form-select.vue 组件中每个属性的含义,并用表格列出它们是否与后端字段直接相关: 属性解释表格&…...
ovs实现lb负载均衡
负载均衡定义 负载均衡器的实现原理是通过硬件或软件设备将客户端访问流量根据转发策略分发到多个服务器或设备上,以确保系统的负载均衡。常见的实现方式包括: 二层负载均衡:使用虚拟MAC地址方式,根据OSI模型的二层进行负载均…...
机器学习-核函数(Kernel Function)
核函数(Kernel Function)是一种数学函数,主要用于将数据映射到一个更高维的特征空间,以便于在这个新特征空间中更容易找到数据的结构或模式。核函数的主要作用是在不需要显式计算高维特征空间的情况下,通过内积操作来实…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
