[扩展中国剩余定理(EXCRT)]
前言
与 这个 定理 搏斗了 一天终于 把它kill 了 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
进入正题
题目描述
给定 n 组 非负整数 ai,bi,求解关于 x 的方程组
x ≡ a1 (mod b1)
x ≡ a2 (mod b2)
.
.
x ≡ an (mod bn)
声明 : M 表示 前 i-1 个bi 的 最小公倍数(LCM), ans 表示 满足前 i-1 个方程的最小解
初始化: 特判 第一组方程 令 M = b1 , ans = a1(第一组的话 b1的最小公倍数就是自己,只看第一个方程 ans 就等于 a1)
从第二组开始:
LCM(b1,b2) = b1×b2 /(gcd(b1,b2))这个不需要证明
因为 此时 M = b1 ,所以原式可化为:
LCM(M,b2) = M×b2 /(gcd(M,b2))
考虑: ans + t×M 一定是 前 i-1 个方程 的通解,因为 ans 是 最小解 所以 ans 加上前 i-1 个方程 bi 的最小公倍数 一定是前 i-1 个方程 的通解。(其中 t ∈ Z)
所以 如果要使得 ans 也满足 下一个方程的话(以第二个 来举例):
ans + t×M ≡ a2 (mod b2) 此时 ans 是a1 是已知的
移项得 : t×M ≡ a2 - ans (mod b2)(这一看就是 扩展欧几里得)(ax ≡ c (mod b))
所以 此时 t 就相当于是 x ,M 相当于是a ,a2 - ans 就相当于是c
所以利用扩展欧几里得 可以 解得t
但是 我们 要考虑 一个问题 扩展欧几里得 的操作
也就是说 我们解得的t 其实是 t × M ≡ gcd(M,b2) (mod b2) 的解
所以 a2 - ans 到 gcd(M,b2) 相当于是乘了一个 gcd(M,b2)/(a2 - ans) 所以我们得到的解 也相当于是 乘了 一个gcd(M,b2)/(a2 - ans)
那么真正的 t 应该是 t/((gcd(M,b2)/(a2 - ans))
也就是 t * (a2 - ans)/gcd(M,b2)
那么 对于下一次 求解来说
更新答案 : ans = ans + t * M,然后 ans = (ans%M + M) % M 保证ans 是最小的正整数解
因为 LCM(M,b2) = M×b2 /(gcd(M,b2)) 所以 M *= b2 /(gcd(M,b2))。
同理 循环 n - 1 次 得到最小的 ans 也就是要求的 x
下面贴代码
#include <cstdio> #include <cctype> #include <iostream> #include <algorithm>using namespace std;typedef long long LL;const int maxn = 100005;int n;LL ai[maxn],bi[maxn];LL quickmul(LL a,LL b,LL mod)// 这是龟速乘 {LL res = 0;while(b){if(b & 1) res = (res + a) % mod;a = (a + a) % mod;b >>= 1; }return res % mod; }LL exGcd(LL a,LL b,LL &x,LL &y)// 扩欧 {if(!b){x = 1;y = 0;return a;}LL r = exGcd(b,a%b,x,y);LL t = x; x = y; y = t - a/b * y;return r; }LL exCrt() {LL x,y;LL M = bi[1], ans = ai[1];// 特判 第一组 解 for(int i=2;i<=n;i++){LL a = M, b = bi[i], c = (ai[i] - ans % b + b) % b;// a*x ≡ c (mod b) LL gcd = exGcd(a,b,x,y);x = quickmul(x,c/gcd,b/gcd);// 相当于 x *= c/gcd ans += x * M;M *= (b / gcd);ans = (ans % M + M) % M;// 找最小的ans }return (ans % M + M) % M; }int main() {scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&bi[i],&ai[i]);printf("%lld",exCrt());return 0; }
转载于:https://www.cnblogs.com/-Wind-/p/10705070.html
[扩展中国剩余定理(EXCRT)]相关推荐
- 中国剩余定理(CRT)扩展中国剩余定理(exCRT)
前言 中国剩余定理(也叫孙子定理)并不是很复杂,由于最近用到了,以前学的时候还不写博客,所以现在补一下 中国剩余定理(CRT) 问题 给出nnn个同余方程 x≡a1(modp1)x≡a2(modp2) ...
- 扩展中国剩余定理 exCRT 学习笔记
前言 由于 \(\{\mathrm{CRT}\}\subseteq\{\mathrm{exCRT}\}\),而且 CRT 又太抽象了,所以直接学 exCRT 了. 摘自 huyufeifei 博客 这 ...
- P4777-[模板]扩展中国剩余定理(EXCRT)
正题 题目链接:https://www.luogu.org/problem/P4777 题目大意 求方程 {x≡a1(modb1)x≡a2(modb2)...x≡an(modbn)\begin{cas ...
- 中国剩余定理(CRT)和扩展中国剩余定理(EXCRT)
Tip:建议读者不要太着急后翻,按照顺序阅读有助于理解 中国剩余定理(CRT) 问题引出 "有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何?"即,一个整数除以三余 ...
- [数论]-----中国剩余定理(扩展中国剩余定理)
中国剩余定理 中国剩余定理(CRT)用于求形如: { x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) ⋯ ⋯ x ≡ a k ( m o d m k ) \be ...
- 中国剩余定理 扩展中国剩余定理 模板
中国剩余定理解线性同余线性方程 /*long long gcd(LL a,LL b) {return b==0?a:gcd(b,a%b); }*/ #include<bits/stdc++.h& ...
- 中国剩余定理 扩展中国剩余定理 (模板)
中国剩余定理 && 扩展中国剩余定理 一个整数除以三余二,除以五余三,除以七余二,求这个整数. 例题: 一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K.例如,K % ...
- 数学--数论--中国剩余定理+扩展中国剩余定理(孙子定理)
中国剩余定理 问题 求解同余方程组 其中m1,m2,m3...mkm_1,m_2,m_3...m_km1,m2,m3...mk为两两互质的整数 求x的最小非负整数解 定理 令M=∏i=1kmi ...
- 模线性方程(中国剩余定理+扩展中国剩余定理)
已知一系列除数和模数,求最小的满足条件的数 我们先考虑一般的情况,即模数不互质.(扩展中国剩余定理) 我们考虑两个方程的情况 x%M=R x=k1∗M+Rx=k1 * M+Rx=k1∗M+R x%m= ...
最新文章
- 日期格式YYYY-mm-dd HH:MM:SS大小写解释
- iOS10 NSURLErrorDomain Code 1200
- react java_独眼巨人React组织了Java 8库的寒武纪爆发
- 在WebGL场景中进行棋盘操作的实验
- centos7 安装redis_Redis6安装(上) - 单机单实例
- Python实现二叉树的遍历
- 阿里CTO张建锋:明年双11将大规模应用含光AI芯片
- 职称计算机提前考试试卷,职称计算机考试多项选择考试卷模拟考^试题
- numpy 二维、高维矩阵重新排列轴与数据(轴转换)
- Strategy模式的一点思考
- html+默认ie11,IE11浏览器设置成默认浏览器的方法
- 抄底利器!如何用Python量化 识别股票双底形态走势!
- 江苏最新建筑施工塔式起重机(建筑特种作业)特种工(塔式起重机)机考题库真题及答案解析
- VS2019 MFC ODBC 操作SQL SERVER 数据库
- mac u盘linux 双系统安装教程,U盘安装MAC双系统完美方案实现在MAC系统下使用双系统...
- MMORPG游戏的典型架构
- RT-Thread Studio学习(四)infrared软件包
- 我是Papi酱,一个集才华与美貌于一身的过气网红
- 音视频从入门到精通——FFmpeg分离出PCM数据实战
- 所学计算机课程或艺术技能,浅议小学计算机教学论文