笔记---中国剩余定理

news2024/11/16 17:53:05

全程学自y总
AcWing.204.表达整数的奇怪方式
给定 2 n 2n 2n 个整数 a a a1, a a a2,…, a a an m m m1, m m m2,…, m m mn,求一个最小的非负整数 x x x,满足 ∀ i ∈ [ 1 , n ] , x ≡ m ∀i∈[1,n],x≡m i[1,n],xmi ( m o d a (mod a (modai ) ) )

输入格式
第 1 行包含整数 n n n

第 2… n n n+1 行:每 i i i+1 行包含两个整数 a a ai m m mi,数之间用空格隔开。

输出格式
输出最小非负整数 x x x,如果 x x x 不存在,则输出 −1。

数据范围
1 ≤ a 1≤a 1ai ≤ 231 − 1 , 0 ≤ m ≤231−1,0≤m 2311,0mi < a <a <ai
1 ≤ n ≤ 25 1≤n≤25 1n25
所有 m m mi 的最小公倍数在 64 64 64 位有符号整数范围内。

输入样例:

8 7
11 9

输出样例:

31

中国剩余定理:
M = m M=m M=m1 ∗ m *m m2 ∗ . . . m *...m ...mk

M M Mi = = = M m   i   \frac{M}{m~i~} m i M。即Mi表示除了mi之外其他所有m的乘积,则Mi和mi是互质的,则我们可以求出 M M Mi m o d m modm modmi的逆元

用Mi-1表示 M M Mi m o d m modm modmi的逆元,逆元即 a ∗ x ≡ 1 ( m o d m ) a*x ≡ 1(modm) ax1(modm),即我们可以通过扩展欧几里得算法来求出逆元

x = a x = a x=a1 ∗ M *M M1 ∗ M *M M1-1 + a +a +a2 ∗ M *M M2 ∗ M *M M22 + + + a a an ∗ M *M Mn ∗ M *M Mn-1。此式子得到的 x x x就是解

对于此道题:我们现在有很多个方程(x mod ai = mi),需要在每一步去合并方程
过程如下:
在这里插入图片描述
代码如下:

#include<iostream>
using namespace std;
#define ll long long

ll exgcd(ll a, ll b, ll &x, ll &y) {	//扩展欧几里得算法
	if (!b) {
		x = 1, y = 0;
		return a;
	}
	ll d = exgcd(b, a % b, y, x);
	y -= a / b * x;
	return d;
}

int main() {
	int n; cin >> n;

	bool has_answer = 1;	//判断是否有解

	ll a1, m1;
	cin >> a1 >> m1;	//第一个方程的a1和m1

	for (int i = 0; i < n - 1; i++) {	//要合并n-1次方程
		ll a2, m2;
		cin >> a2 >> m2;//第二个方程的a2和m2

		ll k1, k2;		//要求的系数
		ll d = exgcd(a1,a2,k1,k2);	//求最大公约数同时求出了系数
		
		if ((m2 - m1) % d) {	//如果m2-m1和最大公约数不成倍数,那么无解
			has_answer = 0;
			break;
		}
		//此时求出的d为k1*a1 - k2*a2的最大公约数,而我们要求相对于m2-m1的
		//则需把求出的k1,k2乘上m2-m1 / d
		k1 *= (m2 - m1) / d;	//更新k1
		ll t = a2 / d;
		k1 = (k1 % t + t) % t;	//在k1的众多解中,取出最小的那个

		m1 = a1 * k1 + m1;		//更新m1,以进行下次合并方城
		a1 = abs(a1 / d * a2);	//更新a1
	}

	if (has_answer) {
		cout << (m1 % a1 + a1) % a1 << endl; //保证负数时求出正确的模数,上面t同理(C++直接模会与数学结果不同)
	}
	else {
		cout << -1 << endl;
	}

	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI-数学-高中-14-函数零点存在定理和运用

原作者视频&#xff1a;【函数综合】【考点精华】1零点存在性定理的运用&#xff08;基础&#xff09;_哔哩哔哩_bilibili 1.定义&#xff1a; 2.零点存在定义&#xff1a; 2.函数零点与图像焦点的转化 零点如果不好求&#xff0c;将函数化成两个函数再画图&#xff0c;看函数…

Elasticsearch:构建自定义分析器指南

在本博客中&#xff0c;我们将介绍不同的内置字符过滤器、分词器和分词过滤器&#xff0c;以及如何创建适合我们需求的自定义分析器。更多关于分析器的知识&#xff0c;请详细阅读文章&#xff1a; 开始使用 Elasticsearch &#xff08;3&#xff09; Elasticsearch: analyzer…

uni-app在hbuilderx打开微信开发工具运行

一、运行设置配置微信开发者工具路径 运行-运行到小程序模拟器-运行设置 配置微信开发工具的安装路径&#xff08;可浏览文件位置选择&#xff09;&#xff1b;web服务器端口号在第二步骤获得&#xff1b; 二、打开微信开发者工具设置-安全设置 打开服务端口开关&#xff0…

C# webbrowser控件设置代理IP访问网站

目录 前言 一、WebBrowser控件简介 二、代理IP简介 三、设置WebBrowser控件的代理IP 1. 引入相关命名空间 2. 定义修改代理IP的函数 3. 修改代理IP 4. 取消代理IP设置 四、使用WebBrowser控件访问代理IP 五、完整示例代码 总结 前言 C# WebBrowser控件是一个非常常…

Linux+服务器后台运行程序

在Linux服务器直接运行程序&#xff0c;程序运行的时间较长&#xff0c;程序经常会因为网络连接问题异常终止&#xff0c;一直盯着程序运行又费时费力&#xff0c;这时后台运行程序是更好的解决方式。But&#xff0c;如果服务器重启了&#xff0c;那所有进程都断掉了&#xff0…

ArrayList集合初始化长度是多少,初始化的时候分配内存空间吗

ArrayList一旦初始化&#xff0c;在内存中就会分配空间吗 是的&#xff0c;当ArrayList在Java中初始化时&#xff0c;即使它没有添加任何元素&#xff0c;也会立即分配内存空间。具体来说&#xff0c;对于默认构造函数创建的ArrayList&#xff08;即不指定初始容量&#xff09…

Python代码覆盖率工具

Coverage.py是一个用于测量Python程序代码覆盖率的工具。它监视您的程序&#xff0c;注意代码的哪些部分已经执行&#xff0c;然后分析源代码&#xff0c;以确定哪些代码本可以执行&#xff0c;但没有执行。 覆盖率测量通常用于衡量测试的有效性。它可以显示代码的哪些部分正在…

Yolo v8 入门学习之采用 coco128 数据集进行图片检测测试

示例入门代码 from ultralytics import YOLO import cv2 import matplotlib.pyplot as plt import matplotlib.image as mpimgdef test():# Create a new YOLO model from scratchmodel YOLO(yolov8n.yaml)# Load a pretrained YOLO model (recommended for training)model …

【Cookie反爬虫】某采购网站动态Cookie加点选验证码校验分析与实战

文章目录 1. 写在前面2. 请求分析3. JS反混淆4. 深度分析 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋…

CentOS7中安装ElasticSearch

文章目录 检测是否安装了Elasticsearch安装JDK下载java配置 下载Elasticsearch解压安装Elasticsearch修改配置文件启动Elasticsearch常见问题 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasti…

Kotlin 协程1:深入理解withContext

Kotlin 协程1&#xff1a;深入理解withContext 引言 在现代编程中&#xff0c;异步编程已经变得非常重要。在 Kotlin 中&#xff0c;协程提供了一种优雅和高效的方式来处理异步编程和并发。在这篇文章中&#xff0c;我们将深入探讨 Kotlin 协程中的一个重要函数&#xff1a;wi…

SpringMVC实现对网页的访问,在请求控制器中创建处理请求的方法

目录 测试HelloWorld RequestMapping注解 RequestMapping注解的位置 RequestMapping注解的value属性 RequestMapping注解的method属性 SpringMVC支持路径中的占位符&#xff08;重点&#xff09; SpringMVC获取请求参数 1、通过ServletAPI获取 2、通过控制器方法的形参…

华为VRP系统简介

因为现在国内主流是华为、华三、锐捷的设备趋势&#xff0c;然后考的证书也是相关的&#xff0c;对于华为设备的一个了解也是需要的。 一、VRP概述 华为的VRP(通用路由平台)是华为公司数据通信产品的通用操作系统平台&#xff0c;作为华为公司从低端到核心的全系列路由器、以太…

Narak靶机渗透

靶场下载地址&#xff1a;https://download.vulnhub.com/ha/narak.ova 一、靶机配置 导入靶机 攻击机kali的IP为192.168.245.131&#xff0c;靶机的IP设置成NAT模式。 二、信息搜集 用攻击机对存活主机进行扫描及端口探测 对发现的存活主机进行全端口扫描&#xff0c;还是只开…

Mac删除自带的ABC输入法,简单快捷

一、下载PlistEdit Pro软件 二、终端执行 sudo open ~/Library/Preferences/com.apple.HIToolbox.plist 三、其中有一个数字下面的KeyboardLayout Name的value为“ABC”&#xff0c;这就是ABC输入法&#xff0c;点击上面的Delete按钮&#xff0c;删除整项ABC内容&#xff0c…

设置frp在ubuntu开机自启

要在 Ubuntu 上启动 FRP&#xff0c;您可以按照以下步骤进行操作&#xff1a; 下载适用于 Ubuntu 的 FRP。您可以从官方网站下载最新版本的 FRP&#xff1a;https://github.com/fatedier/frp/releases 解压下载的 FRP 文件。您可以使用以下命令从终端解压文件&#xff1a; t…

面试篇-SpringBoot自动配置原理

在Spring Boot中&#xff0c;自动装配是一种强大的功能&#xff0c;它允许开发者快速、简单地配置和管理应用程序的组件。以下是对Spring Boot自动装配原理的详细解释&#xff1a; Spring BootApplication注解源码&#xff1a; SpringBootApplication注解是一个复合注解&#x…

91 C++对象模型探索。RTTI运行时类型识别回顾 与 存储位置介绍

一&#xff0c;RTTI 运行时类型识别&#xff0c;简单回顾 C运行时类型识别RTTI&#xff0c;要求父类这种必须 至少有一个虚函数&#xff0c;如果父类中没有虚函数&#xff0c;那么得到的RTTI就不准确&#xff1b; RTTI就可以在执行期间查询一个多态指针&#xff0c;或者多态应…

初始化和赋值

列表初始化 #include <iostream>struct test{int a; };class object{ public:object(int v10):a{v}{}int a; };int main(){test t1;test t2{};std::cout<<t1.a<<std::endl;std::cout<<t2.a<<std::endl;object b2{11};std::cout<<b2.a<…