算法——数论——同余

目录

同余

一、试题 算法训练 同余方程


同余

  • 同余使人们能够用等式的形式简洁地描述整除关系
  • 同余:若 m(正整数),a 和 b 是整数,a%m==b%m,或(a-b)%m==0,记为  b(mod m)
  • 求解一元线性同余方程等价于求解二元线性丢番图方程  
    • 一元线性同余方程 ax\equiv b(mod m),解法看下面第一题
    • 二元线性丢番图方程 ax+my=b
  • 逆:ax\equiv 1(mod m)的一个解为 a 模 m 的逆

一、试题 算法训练 同余方程

问题描述

  求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解。

输入格式

  输入只有一行,包含两个正整数ab,用一个空格隔开。

输出格式

  输出只有一行,包含一个正整数x0,即最小正整数解。输入数据保证一定有解。

样例输入

3 10

样例输出

7

数据规模和约定

  对于40%的数据,2 ≤b≤ 1,000;
  对于60%的数据,2 ≤b≤ 50,000,000;
  对于100%的数据,2 ≤ab≤ 2,000,000,000。

 

 分析:

  • 这行代码 (x % b + b) % b 的目的是确保最终的结果落在 0 到 b-1 的范围内,即取余操作的结果始终为非负数。

    首先,我们知道 % 运算符返回的结果可能是负数,具体取决于被除数和除数的正负性。为了保证结果始终为非负数,我们首先对 x 求模 b,得到一个值在 -b+1 到 b-1 之间的数。然后,我们加上 b,这样就可以确保结果大于等于 0 且小于 2b。最后再次对 b 取模,使结果落在 0 到 b-1 的范围内。

    这样的处理方式可以确保得到正确的最小正整数解,同时保证结果在合理的范围内。

package no1_1;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);long a = scanner.nextInt();long b = scanner.nextInt();System.out.println(modInverse(a, b));}//求a模b的逆,即为同余方程的一个解public static long modInverse(long a, long b) {//求逆long[] result = new long[2];extendGcd(a, b, result);//扩展欧几里得算法求ax+by=1的一个特解result[0]long x = result[0];return (x % b + b) % b;//保证返回最小正整数}public static long extendGcd(long a, long b, long[] result) {if (b == 0) {result[0] = 1;result[1] = 0;return a;}long[] temp = new long[2];long d = extendGcd(b, a % b, temp);result[0] = temp[1];result[1] = temp[0] - a / b * temp[1];return d;}
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/473550.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Halcon 相机标定

文章目录 算子单相机标定单相机标定畸变的矫正 算子 gen_caltab 生成标定文件 gen_caltab(::XNum,YNum,MarkDist,DiameterRatio,CalTabDescrFile,CalTabPSFile :) 算子来制作一个标定板XNum 每行黑色标志圆点的数量。YNum 每列黑色标志圆点的数…

2023年程序员观察报告

春节假期已过,2023年悄然过去,2024年已经到来,无论2023年是快乐的、成长的、积极的,亦或是痛苦的、寂寥的、迷茫的,都要恭喜在座的各位程序员又熬过了一年! ①加班篇 2023年,你完成了 132个需求…

【数据结构】17 二叉树的建立

二叉树的建立 由于树是非线性结构,创建一颗二叉树必须首先确定树中结点的输入顺序,常用方法是先序创建和层序创建。 层序创建所用的节点输入序列是按数的从上至下从左到右的顺序形成的各层的空结点输入数值0。在构造二叉树过程中需要一个队列暂时存储各…

Linux网络编程——守护进程

文章目录 1. 前台 & 后台进程2. Linux进程之间的关系3. 守护进程 本章Gitee仓库:守护进程 1. 前台 & 后台进程 在Linux系统登陆的时候,它会给我们形成一次会话,会话在系统里面会创建一个bash进程,这个bash就会给用户提供…

websocket数据帧格式

客户端、服务端数据的交换,离不开数据帧格式的定义。因此,在实际讲解数据交换之前,我们先来看下WebSocket的数据帧格式。 WebSocket客户端、服务端通信的最小单位是帧(frame),由1个或多个帧组成一条完整的消…

IP地址+子网掩码+CIDR学习笔记

目录 一、IP地址 1、表示方法: 2、特殊IP地址 二、子网掩码 1、判断网络位和主机位 2、子网划分 三、无分类编址CIDR 1、CIDR路由汇聚 汇聚规则: 汇聚ID: 2、最佳路由匹配原则 一、IP地址 1、表示方法: 机器中存放的…

SQL32 截取出年龄(substring_index函数的用法)

代码 select substring_index(substring_index(profile,,,3),,,-1) as age ,count(device_id) from user_submit group by age知识点 substring_index(FIELD, sep, n)可以将字段FIELD按照sep分隔: (1).当n大于0时取第n个分隔符(n从1开始)之前的全部内容&#xff1…

【Linux系统化学习】文件重定向

目录 文件内核对象 文件描述符的分配规则 重定向 重定向的概念 dup2系统调用 输出重定向 追加重定向 输入重定向 stderr解析 重定向到同一个文件中 分离常规输出和错输出 文件内核对象 上篇文章中我们介绍到了操作系统中的文件,操作系统为了方…

基于STM32的老人心率监测系统

1. 系统设计 本次课题为基于STM32的老人心率监测系统,在此设计了如图2.1所示的系统结构框图,整个系统包括了MAX30102心率血氧检测模块,SIM800短信模块,液晶显示模块,按键,ESP8266无线通信模块以及主控制器s…

1Coze平台介绍

2023年随着OpenAI推出GPT 3.5,AI赛道变得更加火热。GPT(Generative Pre-trained Transformer)是一种自然语言处理(NLP)模型,用于生成文本、理解语言和进行各种语言任务。GPT是由OpenAI开发的,它…

32.3K Star,再见 Postman,这款开源 API 客户端更香

Hi,骚年,我是大 G,公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注。 使用 API 工具来调试接口是后端开发经常会使用的,之前一直…

鸿蒙应用开发工程师招聘多吗?工资有多少呢?

随着鸿蒙操作系统的快速普及,越来越多的企业开始重视鸿蒙应用开发人才的培养和引进。那么,目前市场上鸿蒙应用开发工程师招聘多吗?工资有多少呢? 首先,我们来了解一下鸿蒙应用开发工程师的招聘情况。随着鸿蒙操作系统…