尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

洛谷题单指南-进阶数论-P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪
📅 发布时间:2026/6/19 18:20:17

原题链接: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;
}

 

相关新闻

  • 发现5个宝藏文件摆渡系统 2025年企业首选的摆渡方案是这个!
  • BilldDesk:基于Vue3+WebRTC+Nodejs+Electron的开源远程桌面控制 - 详解
  • 查看linux部署网站的TLS版本号

最新新闻

  • 上海汽车音响改装选哪家?上海音乐人生,二十年赛事级连锁标杆门店 - 音乐人生汽车音响
  • 技术解析:从Tri-Plane到3D GAN,如何实现高效且一致的神经渲染
  • 通过Selenium实现网页截图来生成应用封面
  • 2026苏州钻石回收实测|国标4C定级,全城无套路靠谱门店变现指南 - 薛定谔的梨花猫
  • C语言宽字符处理:wmemcmp、wmemcpy、wprintf核心函数详解与实战
  • 多模态大语言模型LISA

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号