当前位置: 首页 > backend >正文

洛谷 P1495:【模板】中国剩余定理(CRT)/ 曹冲养猪

【题目来源】
https://www.luogu.com.cn/problem/P1495
https://www.acwing.com/problem/content/225/

【题目描述】
自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪。可是曹冲满不高兴,于是在工作中马马虎虎。有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。举个例子,假如有 16 头母猪,如果建了 3 个猪圈,剩下 1 头猪就没有地方安家了。如果建造了 5 个猪圈,但是仍然有 1 头猪没有地方去,然后如果建造了 7 个猪圈,还有 2 头没有地方去。你作为曹操的私人秘书理所当然要将准确的猪数报给曹操,你该怎么办?

【输入格式】
第一行包含一个整数n:建立猪圈的次数。
接下来n行,每行两个整数ai、bi,表示建立了ai个猪圈,有bi头猪没有去处。你可以假定a1~an互质。

【输出格式】
输出包含一个正整数,即为曹冲
至少养母猪的数目。

【输入样例】
3
3 1
5 1
7 2

【输出样例】
16

【说明/提示】
1≤n≤
10
0≤bi<ai≤
100000
1≤∏ai≤
10^18

【算法分析】
● 中国剩余定理应用的充要条件是
模数互质(在本题中也就是猪圈数目互质)。

● 中国剩余定理算法步骤
(1)计算模数的乘积:M=m1·m2·…·mk
(2)对每个模数 mi,计算 Mi=M/mi
(3)对每个 Mi,求解 Mi 在模 mi 下的逆元 yi,即满足 Mi·yi≡1(mod mi)
(4)最终解 x 为:x=∑ai·Mi·yi(mod M),i∈(1,k)
其中,ai 是每个同余方程的余数。

● 中国剩余定理应用示例
例题:给定同余方程组: x≡2(mod 3),x≡3(mod 5),x≡2(mod 7) 由于模数 3、5、7 互质,所以可以采用中国剩余定理求解。步骤如下:
(1)计算 M=3×5×7=105。
(2)计算每个 Mi:M1=105/3=35,M2=105/5=21,M3=105/7=15。
(3)计算每个逆元 yi: 对于 M1=35,求解 35·y1≡1(mod 3),得到 y1=2。 对于 M2=21,求解 21·y2≡1(mod 5),得到 y2=1。 对于 M3=15,求解 15·y3≡1(mod 7),得到 y3=1。
(4)求解 x: x=(2×35×2+3×21×1+2×15×1) mod 105 =233 mod 105=23。

【算法代码】

#include <bits/stdc++.h>
using namespace std;typedef long long LL;
const int N=15;
LL m[N],a[N];LL exgcd(LL a,LL b,LL &x,LL &y) {if(b==0) {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;LL M=1;for(int i=1; i<=n; i++) {cin>>m[i]>>a[i];M*=m[i];}LL t=0;for(int i=1; i<=n; i++) {LL x,y;LL Mi=M/m[i];exgcd(Mi,m[i],x,y);t=(t+a[i]*Mi%M*x)%M;}t=(t+M)%M;cout<<t<<endl;return 0;
}/*
in:
3
99991 99990
99989 99988
99971 99970out:
282926331270118
*/




【参考文献】
https://www.luogu.com.cn/problem/P1495
https://www.luogu.com.cn/problem/P4777
https://www.acwing.com/problem/content/206/
https://blog.csdn.net/qq_33127317/article/details/108439841
https://www.luogu.com.cn/problem/solution/P1495
https://blog.csdn.net/qq_51352378/article/details/123491047
https://www.acwing.com/solution/content/148128/
https://www.acwing.com/solution/content/164120/

http://www.xdnf.cn/news/3911.html

相关文章:

  • 数字化转型-4A架构之业务架构
  • 深度优先搜索(DFS)与广度优先搜索(BFS):图与树遍历的两大利器
  • 74HC123的电路应用场景
  • 一键获取当前项目的所有文件结构并保存到文本文件
  • 【数据结构与算法】常见排序算法详解(C++实现)
  • Java大师成长计划之第12天:性能调优与GC原理
  • word页眉去掉线
  • LLama-v2 权重下载
  • Linux 进程基础(二):操作系统
  • TensorFlow深度学习实战——基于循环神经网络的词性标注模型
  • 接口自动化测试项目框架详解
  • USB Type-C是不是全方位优于其他USB接口?
  • 在有限的内存中计算超限数据的重复值
  • c++ 之 cout
  • 【形式化验证】动态逻辑(DL)的定义解释与示例
  • Docker 渡渡鸟镜像同步站 使用教程
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】2.5 事务与锁机制(ACID特性/事务控制语句)
  • 强化学习机器人模拟器——QAgent:一个支持多种强化学习算法的 Python 实现
  • cuDNN 9.9.0 便捷安装-Windows
  • 67. Java 嵌套类 - 详解内部类
  • Rust与C/C++互操作实战指南
  • 大型网站架构演化过程:从单体到分布式服务的全景解析
  • RR(Repeatable Read)级别如何防止幻读
  • 31.软件时序控制方式抗干扰
  • maven坐标导入jar包时剔除不需要的内容
  • C++类_协变返回类型
  • 【KWDB 创作者计划】_KWDB 性能优化与调优
  • redis的持久化
  • Spring的循环依赖问题
  • 工业认知智能:从数据分析到知识创造