《洛谷深入浅出进阶篇》同余方程+中国剩余定理——洛谷P1495

这篇文章讲介绍:同余方程,中国剩余定理

什么是同余方程?

x\equivy (mod p)这样的,带同余号的式子就是同余方程。

什么是中国剩余定理?

中国剩余定理,顾名思义是出自中国,它最早在《孙子算经》中出现,就是为了解决一类一元一次线性同余方程。

举个例子:

有一个数,对3取模为2,对5取模为3,对7取模为2 , 求这个数

写成同余方程就是:
1:x ==2(mod 3)
2:x ==2(mod 5)
3:x ==2(mod 7)
我们需要去解这个同余方程组。
就需要用到中国剩余定理(具体证明可以自查,这里只给出结论)

1:x ==a1(mod m1)
2:x ==a2(mod m2)
3:x ==a3(mod m3)
.....
n:  x == an ( mod mn )

其中m1,m2,m3......mn两两互质
第一步:设M=m1*m2*m3*.......mn =\prod_{i=1}^{n}m_{i}


第二步:设 bi = M / mi (整除)


第三步:设 inv(bi)\equiv bi^-1 (mod mi)   (不是bi的倒数,是bi模mi的逆元)

利用  bi * inv(bi) \equiv 1 (mod mi) 求出 inv(i)

我们就可以得到x的通解:
第四步:x= a1*b1*t1 + a2*b2*t2+…… an*bn*tn + kM = \prod_{i=1}^{n}ai*inv(bi)*bi;

代入上面的例子我们可以得到:x=23+k*105;

所以我们需要分成 四步来求,
第一步:累乘模数  M=m1*m2*……mn;
第二步:累乘结果除以对应模数: bi = M/mi
第三步:求bi模以mi的逆元 inv(bi) (用费马小定理,或exgcd)
第四步:求和    (余数*逆元*(模数之积/模数)) + k模数之积

也就是 x = [从i=0到i=n累加]:( ai*inv(bi)*bi )+ kM,

所以我们就求出了x的通式子,我们要算出最小正整数x应该咋办捏,就直接+M 在对M取模就行了嗷嗷嗷。
x=(x+M)%M;

 

洛谷P1495 曹冲养猪

设其一共有x只母猪。
已知数据:(为了套板子,直接把数组名换成熟悉的)
猪圈数:m1,m2,m3,m4……mn
剩余猪:a1,a2,a3,a4……an

也就是猪圈就是模数,剩余猪就是余数。
也就有同余方程组:

x==a1 (mod m1)
x==a2 (mod m2)
………………
x==an(mod mn)

接下来用中国剩余定理套板子即可:

第一步:求模数之积:M = m1*m2*m3……mn
第二步:求模数之积除以当前模数:bi=M/mi
第三步:求bi模以mi逆元inv(bi):

如何用exgcd求inv(bi)
下面推公式:
bi*inv(bi) = 1 (mod mi)
bi*inv(bi)+ y*mi = 1
exgcd(bi,mi,&inv(bi),&y)即可
数据保证 bi 与 mi 互质

第四步:求和
x = (求和)ai*bi*inv(bi)+kM
由于我们要求的是最小正整数的x,所以直接套公式:
x=(x+ai*bi*inv(bi)+M)%M;
x=(x%M+ai*bi*inv(bi)%M +M)%M;

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<cctype>
#include<map>
#include<set>
#include<queue>
#include<numeric>
#include<iomanip>
using namespace std;
typedef long long LL;
const int N = 20;void exgcd(int a, int b, int &x, int &y) {if (b == 0) {x = 1, y = 0;return;}exgcd(b, a % b, y, x);y -= a / b * x;
}
LL M = 1;
int inv[N], a[N], m[N];
LL b[N];
int t;
int main() {int n;cin >> n;for (int i = 1; i <= n; i++) {cin >> m[i] >> a[i]; // m为模数,a为余数M *= m[i]; // 求模数之积}LL x = 0;for (int i = 1; i <= n; i++) {//求模数之积除以当前模数b[i] = M / m[i];exgcd(b[i], m[i], inv[i], t);inv[i] = (m[i] + inv[i]) % m[i];while (a[i]--) {x = (x + inv[i] * b[i])%M;}}cout << x;}


 

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

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

相关文章

CoSeR: Bridging Image and Language for Cognitive Super-Resolution

主页&#xff1a;CoSeR: Bridging Image and Language for Cognitive Super-Resolution (coser-main.github.io) 图像超分辨率技术旨在将低分辨率图像转换为高分辨率图像&#xff0c;从而提高图像的清晰度和细节真实性。这项技术在手机拍照等领域有着广泛的应用和需求。随着超…

Redis5新特性-stream

Stream队列 Redis5.0 最大的新特性就是多出了一个数据结构 Stream&#xff0c;它是一个新的强大的 支持多播的可持久化的消息队列&#xff0c;作者声明 Redis Stream 地借鉴了 Kafka 的设计。 生产者 xadd 追加消息 xdel 删除消息&#xff0c;这里的删除仅仅是设置了标志位&am…

vue.js el-table 动态单元格列合并

一、业务需求&#xff1a; 一个展示列表&#xff0c;表格中有一部分列是根据后端接口动态展示&#xff0c;对于不同类型的数据展示效果不一样。如果接口返回数据是’类型1‘的&#xff0c;则正常展示&#xff0c;如果是’类型2‘的数据&#xff0c;则合并当前数据的动态表格。…

RTSP流媒体播放器

rtsp主要还是运用ffmpeg来搭建node后端转发到前端&#xff0c;前端再播放这样的思路。 这里讲的到是用两种方式&#xff0c;一种是ffmpeg设置成全局来实现&#xff0c;一种是ffmpeg放在本地目录用相对路径来引用的方式。 ffmpeg下载地址&#xff1a;http://www.ffmpeg.org/do…

焊接专业个人简历(通用25篇)

如果大家想在焊接行业的求职中脱颖而出&#xff0c;轻松斩获心仪职位&#xff0c;参考这25篇通用的焊接专业个人简历案例&#xff0c;无论您是初学者还是资深焊工&#xff0c;都能从中找到适合自己的简历内容。参考这些简历&#xff0c;让您的求职之路更加顺畅。 焊接专业个人…

软件工程 课后题 选择 查缺补漏

在一张状态图中只能有一个初态&#xff0c;而终态则可以没有&#xff0c;也可以有多个 所有的对象可以成为各种对象类&#xff0c;每个对象类都定义了一组 方法 通过执行对象的操作可以改变对象的属性&#xff0c;但它必须经过 消息 的传递 UML应用于 基于对象的面向对象的方…

nn.AdaptiveAvgPool2d(output_size)输入和输出怎么回事?

前言 nn.AdaptiveAvgPool2d(output_size) 函数作用&#xff1a;自适应进行平均池化。不用管输入、stride、padding&#xff0c;函数参数只有输出大小&#xff0c;其他的这个函数帮你搞定。 问题就是&#xff0c;我想知道他是咋搞定的&#xff1f; 1 函数的使用 先把例子摆上…

年底了,项目预算怎么创建?9个步骤直接搞定

如果将项目比作一辆汽车&#xff0c;那么预算就是它的燃料。就像汽车需要汽油一样&#xff0c;项目也需要资金和资源来维持运转。而作为项目经理&#xff0c;应该尽量用最有效的方式规划和使用这些资源&#xff0c;使项目按时交付。 项目预算是一项计划&#xff0c;其中详细说…

Gorm框架入门

文章目录 安装连接数据库Gorm基本示例自动迁移创建数据行查询数据更新数据删除数据 Gorm Model主键表名列名 时间戳CreatedAtUpdatedAtDeletedAt GORM&#xff08;Go Object Relational Mapper&#xff09;是一个在Go语言中使用的对象关系映射&#xff08;ORM&#xff09;库。它…

C++基础 -37- 模板函数与普通函数调用规则

当模板函数比普通函数更好匹配形参的时候&#xff0c;会优先调用模板函数 #include "iostream"using namespace std;template <class T> void show(T a, T b) {cout << a << endl;cout << b << endl;cout << "temp show&…

【MATLAB源码-第92期】基于simulink的QPSK调制解调仿真,采用相干解调对比原始信号和解调信号。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 QPSK&#xff0c;有时也称作四位元PSK、四相位PSK、4-PSK&#xff0c;在坐标图上看是圆上四个对称的点。通过四个相位&#xff0c;QPSK可以编码2位元符号。图中采用格雷码来达到最小位元错误率&#xff08;BER&#xff09; —…

销售时如何站在客户角度思考问题?

销售时如何站在客户角度思考问题&#xff1f; 好的&#xff0c;以下是对提供的内容进行润色后的结果&#xff1a; 当销售时&#xff0c;如何站在客户的角度去思考问题呢&#xff1f;这需要我们具备一种换位思考的能力&#xff0c;从客户的角度出发&#xff0c;了解他们的需求…

INFINI Easysearch 与华为鲲鹏完成产品兼容互认证

何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务&#xff08;含公有云、私有云、混合云、桌面云&#xff09;推出的一项合作伙伴计划&#xff0c;旨在为构建持续发展、合作共赢的鲲鹏生态圈&#xff0c;通过整合华为的技术、品牌资源&#xff0c;与合作伙伴共享商机和利…

前端传参中带有特殊符号导致后端接收时乱码或转码失败的解决方案

文章目录 bug背景解决思路1&#xff1a;解决思路2解决思路3&#xff08;最终解决方案&#xff09;后记 bug背景 项目中采用富文本编辑器后传参引起的bug&#xff0c;起因如下&#xff1a; 数据库中存入的数据会变成这种未经转码的URL编码 解决思路1&#xff1a; 使用JSON方…

【已解决】为什么Word文档里有部分内容无法编辑?

小伙伴们是否遇到过这样的情况&#xff0c;打开Word文档进行编辑&#xff0c;发现部分内容可正常编辑&#xff0c;另外一部分内容却无法编辑。这是怎么回事&#xff0c;又要如何解决呢&#xff1f; 出现以上情况&#xff0c;一般是Word文档被设置了“限制保护”&#xff0c;使…

C++ 系列 第五篇 C++ 算术运算符及类型转换

系列文章 C 系列 前篇 为什么学习C 及学习计划-CSDN博客 C 系列 第一篇 开发环境搭建&#xff08;WSL 方向&#xff09;-CSDN博客 C 系列 第二篇 你真的了解C吗&#xff1f;本篇带你走进C的世界-CSDN博客 C 系列 第三篇 C程序的基本结构-CSDN博客 C 系列 第四篇 C 数据类型…

94.STM32外部中断

目录 1.什么是 NVIC&#xff1f; 2.NVIC寄存器 3.中断优先级 4.NVIC的配置 设置中断分组​编辑 配置某一个中断的优先级 5.什么是EXTI 6.EXTI和NVIC之间的关系 7.SYSCFG 的介绍 1.什么是 NVIC&#xff1f; NVIC是一种中断控制器&#xff0c;主要用于处理 ARM Cort…

自动化框架错误排查:本地全通过,pipline上大部分报错

现象: 最近经过一次切环境和验证码部分的代码重构,果不其然,我们的自动化框架就出错了 我在本地修改调试,并在堡垒机上全部跑过 但在pipline上则大部分报错 进一步排查 这么多case报错,而且报错log都一模一样,推断是底层出错 我在堡垒机上使用命令行来跑case,发现与…

时序预测 | Python实现GA-TCN-LSTM遗传算法-时间卷积神经网络-长短期记忆网络时间序列预测

时序预测 | Python实现GA-TCN-LSTM遗传算法-时间卷积神经网络-长短期记忆网络时间序列预测 目录 时序预测 | Python实现GA-TCN-LSTM遗传算法-时间卷积神经网络-长短期记忆网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 使用先进的机器学习技术和优化算法…