洛谷题单指南-进阶数论-P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪

news/2025/9/24 9:47:46/文章来源:https://www.cnblogs.com/hackerchef/p/19106946

原题链接:https://www.luogu.com.cn/problem/P1495

题意解读:求方程组x ≡ bi (mod ai), i∈[1,n]的最小正整数解,所有的ai互质。

解题思路:

1、中国剩余定理

设方程组为(a1,a2,a3互质):

  • x ≡ b1 (mod a1)
  • x ≡ b2 (mod a2)
  • x ≡ b3 (mod a3)

要找到x满足上面三种情况,设a = a1 * a2 * a3

x需要拆解成三个数:x = (x1 + x2 + x3) % a,

必须满足:

  • x1 % a1 = b1, x1 % a2 = 0, x1 % a3 = 0
  • x2 % a2 = b2, x2 % a1 = 0, x2 % a3 = 0
  • x3 % a3 = b3, x3 % a1 = 0, x3 % a2 = 0

可以看出,

x1是a2、a3的倍数,不妨设x1 = a2 * a3 * k1,a2 * a3 * k1 ≡ b1 (mod a1),

转化为不定方程a2 * a3 * k1 + a1 * p1 = b1,

由于gcd(a2 * a3, a1) = 1,求a2 * a3 * k1 + a1 * p1 = 1的一个k1的解再乘以b1倍即可

又有a2 * a3 * k1 ≡ 1 (mod a1),k1的解就是a2 * a3模a1的逆元,再乘以b1

因此:

k1 = (a2 * a3)-1 * b1

x1 = a2 * a3 * (a2 * a3)-1 * b1

同理分析,可得到:

x2 = a1 * a3 * (a1 * a3)-1 * b2

x3 = a1 * a2 * (a1 * a2)-1 * b3

x = a2 * a3 * (a2 * a3)-1 * b1 + a1 * a3 * (a1 * a3)-1 * b2 + a1 * a2 * (a1 * a2)-1 * b3

= (a / a1) * (a / a1)-1 * b1 + (a / a2) * (a / a2)-1 * b2 + (a / a3) * (a / a3)-1 * b3

x最后要模a

推而广之:

设a = a1 * a2 * ... * an

ti = a / ai,ti-1是ti在模ai意义下的逆元

x = (∑ ti * ti-1 * bi) % a

100分代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;const int N = 15;
LL a[N], b[N];
LL n, A = 1, ans;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 = y - a / b * x;return d;
}LL mul(LL a, LL b, LL mod)
{LL res = 0;while(b){if(b & 1) res = (res + a) % mod;b >>= 1;a = (a + a) % mod;}return res;
}int main()
{cin >> n;for(int i = 1; i <= n; i++){cin >> a[i] >> b[i];A *= a[i];}for(int i = 1; i <= n; i++){LL m = A / a[i];LL x, y;exgcd(m, a[i], x, y); //求m模a[i]的逆元x = (x % a[i] + a[i]) % a[i];//ans = (ans + m * x * b[i]) % A; //可能溢出ans = (ans + mul(m, x * b[i], A)) % A; //快速乘避免溢出}cout << ans;return 0;
}

2、扩展:同时适用于模数不互质的情况

设方程组:

  • x ≡ b1 (mod a1)
  • x ≡ b2 (mod a2)
  • ...
  • x ≡ bn (mod an)

先取前两个方程,展开

x = a1 * s + b1

x = a2 * t + b2

a1 * s - a2 * t = b2 - b1

调整负数为整数,因为t是任意值,所以系数正负没关系,正数便于计算

a1 * s + a2 * t = b2 - b1

用扩展欧几里得算法求a1 * s + a2 * t = gcd(a1, a2)的一个特解s0

如果(b2 - b1) % d != 0,则方程组无解!

设d = gcd(a1, a2), tmp1 = (b2 - b1) / d,tmp2 = a2 / d

s的通解为:s = s0 * tmp1 + tmp2 * k,k为任意整数 

注意:在计算s0 * tmp1时如果数据范围过大可考虑模tmp2的快速乘!前提是tmp1是非负数,即tmp1 = (tmp1 % tmp2 + tmp2) % tmp2

将s的通解代入x = a1 * s + b1得到x = a1 * (s0 * tmp1 + tmp2 * k) + b1,展开得到

x = a1 * tmp2 * k + (a1 * s0 * tmp1 + b1) 

将方程x = a1 * tmp2 * k + (a1 * s0 * tmp1 + b1) 看作x = a1 * s + b1,可以将a1 = a1 * tmp2, b1 = a1 * s0 * tmp1 + b1

将方程x = a3 * s + b3看作x = a2 * s + b2

继续上述合并方程求s的过程,最后处理完所有的方程,对(b1 % a1 + a1) % a1即得到最小正整数解。

100分代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;const int N = 15;
LL a[N], b[N];
LL n, A = 1, ans;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 = y - a / b * x;return d;
}LL mul(LL a, LL b, LL mod)
{LL res = 0;while(b){if(b & 1) res = (res + a) % mod;b >>= 1;a = (a + a) % mod;}return res;
}int main()
{cin >> n;for(int i = 1; i <= n; i++){cin >> a[i] >> b[i];}LL a1 = a[1], b1 = b[1];for(int i = 2; i <= n; i++){int a2 = a[i], b2 = b[i];LL s, t;LL d = exgcd(a1, a2, s, t);if((b2 - b1) % d){//无解的情况此题不用考虑}LL tmp1 = (b2 - b1) / d, tmp2 = a2 / d;tmp1 = (tmp1 % tmp2 + tmp2) % tmp2;s = mul(s, tmp1, tmp2);b1 = a1 * s + b1;a1 = a1 * tmp2;}cout << (b1 % a1 + a1) % a1;return 0;
}

 

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

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

相关文章

第十四届蓝桥杯青少组C++选拔赛[2022.12.18]第二部分编程题(4、充电站) - 指南

第十四届蓝桥杯青少组C++选拔赛[2022.12.18]第二部分编程题(4、充电站) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-…

界面控件DevExpress WinForms中文教程:Data Grid - 搜索/查找面板

界面控件DevExpress WinForms中文教程:Data Grid - 搜索/查找面板DevExpress WinForms拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用…

c语言之自定义memcpy

void *Memcpy(void *dest, const void *src, size_t count) { cout<<"sizeof(dest)是:"<<sizeof(dest)<<endl;int bytelen=count/sizeof(dest); /*按CPU位宽拷贝*/int slice=count%si…

国产芯片处理板卡:7-基于国产化FT-M6678+JFM7K325T的6U CPCI信号处理卡

基于国产化FT-M6678+JFM7K325T的6U CPCI信号处理卡一、板卡概述本板卡系我公司自主研发,基于6U CPCI的通用高性能信号处理平台。板卡采用一片国产8核DSP FT-C6678和一片国产FPGA JFM7K325T-2FFG900作为主处理器。为您…

一文详解纷享销客CRM Agent平台3大核心能力(附应用场景与案例)

AI 技术加速渗透业务场景,智能体(Agent)已成为企业提效增长的关键工具 —— 它可助力销售快速掌握客户经营情况、辅助运营规避数据操作差错、帮助新人高效获取业务知识,在营销、销售、服务全链路实现 “数据洞察 -…

php网站开发实训总结东莞网络营销全网推广

简介&#xff1a;企业想要拥有领先的数据分析能力&#xff0c;自研往往需要投入巨大的人力和财力。 Quick BI作为唯一一个连续两年入选Gartner魔力象限的中国BI产品&#xff0c;具备强大的全链路开放集成能力&#xff0c;可以轻松的与企业原有系统匹配融合&#xff0c;帮助企业…

QOJ #5076. Prof. Pang and Ants 题解

Description 在庞教授的大房子边上,有一群包含 \(m\) 只蚂蚁的蚁群,居住在有 \(n\) 个洞口的洞穴里。 它们会外出寻找食物。食物在庞教授的大冰箱里,蚂蚁们试图从里面偷出食物来。 特别的, 一只蚂蚁需要 \(1\) 秒从…

微信小程序(uniapp)PDF预览完整实现方案

微信小程序(uniapp)PDF预览完整实现方案Posted on 2025-09-24 09:36 且行且思 阅读(0) 评论(0) 收藏 举报在微信小程序开发中,PDF文件预览是常见的业务需求。本文将提供一套基于uniapp的完整解决方案,涵盖从后…

发现5个宝藏文件摆渡系统 2025年企业首选的摆渡方案是这个!

文件摆渡系统作为解决网络隔离后业务交互的重要工具,其作用和价值不言而喻。不过对于企业的价值究竟是正面的,还是负面的,这就要看用的什么文件摆渡系统了。本文中我们就介绍5种文件摆渡系统,我们来看看首选的摆渡…

如何打开谷歌网站网站备案网站

文章目录 一、文档转换器 & 文本拆分器文本拆分器 二、开始使用文本拆分器三、按字符进行拆分四、代码分割 (Split code)1、PythonTextSplitter2、JS3、Markdown4、Latex5、HTML6、Solidity 五、MarkdownHeaderTextSplitter1、动机2、Use case 六、递归按字符分割七、按tok…

基金网站建设网站建设运营知识

移动应用程序开发的增长速度比以往任何时候都快。几乎每个企业都需要移动应用程序来保持市场竞争力。由于像 React Native 这样的跨平台移动应用程序开发框架允许公司使用单一源代码和单一编程语言构建 iOS 和 Android 应用程序&#xff0c; Flutter是 Google 支持的另一个热门…

BilldDesk:基于Vue3+WebRTC+Nodejs+Electron的开源远程桌面控制 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

css-轮播图效果

<!DOCTYPE html> <html lang="zh-EN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"&g…

aspnetcore使用websocket实时更新商品信息

aspnetcore使用websocket实时更新商品信息先演示一下效果,再展示代码逻辑。中间几次调用过程省略。。。 暂时只用到了下面四个项目1.产品展示页面中第一次通过接口去获取数据库的列表数据/// <summary> /// 获取…

漏洞挖掘实战:如何定制化模糊测试技术

本文深入探讨如何定制化模糊测试工具syzkaller来挖掘Linux内核漏洞。从基础架构解析到实战技巧,涵盖权限设置、网络接口测试、结果筛选机制以及七种独特漏洞发现方法,适合安全研究人员参考。适配模糊测试以挖掘漏洞 …

css-遮罩层效果

<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">&…

nuxt3中使用pdfjs-dist实现pdf转换canvas实现浏览

获取 pdfjsLib.GlobalWorkerOptions.workerSrc 的cdn链接地址https://cdnjs.com/libraries/pdf.js 代码 https://files.cnblogs.com/files/li-sir/cspdf.zip?t=1758676920&download=true

查看linux部署网站的TLS版本号

curl https://域名 -version无可奈何花落去,似曾相识燕归来

【SpringBoot- Spring】学习

Spring官方文档翻译(1~6章 转载至 http://blog.csdn.net/tangtong1/article/details/51326887 Spring官方文档、参考中文文档 一、Spring框架概述 Spring框架是一个轻量级的解决方案,可以一站式地构建企业级应用。Sp…

css-更改鼠标样式

<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">&…