C++实现,拓展中国剩余定理——解同余方程组(理论证明和代码实现)
拓展中国剩余定理
前言
记得半年前还写过关于拓展中国剩余定理的博客。。。不过那时对其理解还不是比较深刻,写的也比较乱。
于是趁学校复习之机,再来重温一下拓展中国剩余定理(以下简称ExCRT)
记得半年前还写过关于拓展中国剩余定理的博客。。。不过那时对其理解还不是比较深刻,写的也比较乱。
于是趁学校复习之机,再来重温一下拓展中国剩余定理(以下简称ExCRT)
一些理论准备
拓展欧几里得解不定方程
对于不定方程\(a*x+b*y=gcd(a,b)\),视a,b为常数,我们有一种通用的方法来求一组特解:
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;
}
注:这种方法只能求一种特解,对于求所有的解请读者自行百度。这个函数运行到最后,x,y便是一组特解,返回值为\(gcd(a,b)\)。
于是我们可以将这个方程推广为解类似于\(a*x+b*y=c\)这个不定方程,方法就是先求出方程\(a*x'+b*y'=gcd(a,b)\)的解,之后将等式两边同时乘以\(c/gcd(a,b)\)。便转换为:
\(a*x'*c/gcd(a,b)+b*y'*c/gcd(a,b)=c\),\(x=x'*c/gcd(a,b),y=y'*c/gcd(a,b)\).
而如果c并不能被\(gcd(a,b)\)整除,那么此不定方程无解
理论证明
对于同余方程:
\(\left\{\begin{matrix}x\equiv r_{1}(mod\: m_{1}) & & \\ x\equiv r_{2}(mod\: m_{2}) & & \\ ...... & & \\x\equiv r_{k}(mod\: m_{k}) \end{matrix}\right.\)
我们可以考虑\(k=2\)的情况,也就是解如下方程:
\(\left\{\begin{matrix}
x\equiv r_{1}(mod\: m_{1})\\
x\equiv r_{2}(mod\: m_{2})
\end{matrix}\right.\)
由如上方程不难转换为以下形式
\(\left\{\begin{matrix}
x=k1*m1+r1\\
x=k2*m2+r2
\end{matrix}\right.\)
将两个式子合并可以得到:
\(k1*m1-k2*m2=r2-r1\)
对于这个不定方程,我们可以使用拓展欧几里得来求解。
先解出方程\(k1'*m1-k2'*m2=gcd(m1,m2)\),于是可以得到
\(k1=k1'*(r2-r1)/gcd(m1,m2)\),代入式子\(x=k1*m1+r1\)便可以算出x的一组特解,设这个特解为\(x0\),那么可以得到通解
\(x=x0+t*lcm(m1,m2)\),于是我们便通过合并第1,2个同余式子得到了新的一个同余方程:\(x\equiv x0(mod\: lcm(m1,m2))。\)
将这个同余方程按照同样的方法与第三个同余式子合并,最后只剩下唯一一个式子\(x\equiv x_{k}(mod\: lcm(所有模数m_{i}))\)。
此时的答案便可以得出最小的答案。
代码实现
LL ExCRT() {
LL M=m[1],R=r[1];
//方便 理解代码的话
//m可以看作上述x0,R可以看作lcm(m1,m2)
for(LL i=2,d,x,y;i<=n;i++) {
d=exgcd(M,m[i],x,y);//d为最大公约数
if((R-r[i])%d) return -1;//无解的情况
x=x*(R-r[i])/d%m[i];
R-=x*M;
M=M/d*m[i];
R%=M;
}
return (R%M+M)%M;//最小的正整数解
}
写在后面
现在发现。。。ExCRT好简单
C++实现,拓展中国剩余定理——解同余方程组(理论证明和代码实现)的更多相关文章
- 拓展中国剩余定理(exCRT)摘要
清除一个误区 虽然中国剩余定理和拓展中国剩余定理只差两个字,但他俩的解法相差十万八千里,所以会不会CRT无所谓 用途 求类似$$\begin{cases}x \equiv b_{1}\pmod{a_{ ...
- E - Two Arithmetic Progressions(CodeForces - 710D)(拓展中国剩余定理)
You are given two arithmetic progressions: a1k + b1 and a2l + b2. Find the number of integers x such ...
- 拓展中国剩余定理(ex_crt)
一般来讲,crt(中国剩余定理)比较常见,而ex_crt(拓展中国剩余定理)不是很常用 但是noi 2018偏偏考了这么个诡异的东西... 所以这里写一个ex_crt模板 模型: 求一个x满足上述方程 ...
- poj2947(高斯消元法解同余方程组)
题目链接:https://vjudge.net/problem/POJ-2065 题意:题目看着较复杂,实际上就是给了n个同余方程,解n个未知数. 思路:套高斯消元法的模板即可. AC代码: #inc ...
- (模板)poj2947(高斯消元法解同余方程组)
题目链接:https://vjudge.net/problem/POJ-2947 题意:转换题意后就是已知m个同余方程,求n个变量. 思路: 值得学习的是这个模板里消元用到lcm的那一块.注意题目输出 ...
- luogu4777[模板]拓展中国剩余定理题解
题目链接 https://www.luogu.org/problemnew/show/P4777 分析 扩展\(CRT\)就是解决模数不互质的情况,说是扩展\(CRT\),其实都是扩欧... 先来考虑 ...
- 2019牛客暑期多校训练营(第十场) Han Xin and His Troop (高精度+拓展中国剩余定理)
题意 裸题 思路 题中的模数之间并不互质,所以应该用拓展中国剩余定理. 但是交上去会炸,__int128过不了,所以用高精度的板子或者java大数都挺好过的. 这里推荐java大数,因为高精度板子用起 ...
- poj 2947 Widget Factory (高斯消元解同余方程组+判断无解、多解)
http://poj.org/problem?id=2947 血泪史: CE:poj的string类型要加string库,swap不能直接交换数组 WA: x[m-1]也有可能<3啊O(≧口≦) ...
- hdu 5755 Gambler Bo (高斯消元法解同余方程组)
http://acm.hdu.edu.cn/showproblem.php?pid=5755 题意: n*m矩阵,每个格有数字0/1/2 每选择一个格子,这个格子+2,4方向相邻格子+1 如何选择格子 ...
随机推荐
- 【Thinkphp5】解决模板输出时间戳自动转换为时间格式的问题
背景: 数据库存储时间为时间戳,格式为varchar,模板输出时未进行时间格式化却输出了时间格式 如下图 (数据库存储的时间戳) (页面输出的时间) (未进行格式化的时间代码) (格式化后的时间代码) ...
- Cobbler自动化装机
Cobbler自动化装机 一个可以实现批量安装系统的Linxu应用程序,他可以实现同个服务器安装不同操作系统版本. 准备环境 开启两个网卡.一个仅主机模式,一个桥接模式,仅主机模式对内提供cobble ...
- hdu 1059 Dividing bitset 多重背包
bitset做法 #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a ...
- linux添加头文件路径
gcc demo.c -o demo -I/tools/libevent/include -L/tools/libevent/lib -levent -I:头文件目录 -L:静态库目录 -l:静态库 ...
- postman(一):详解在postman中使用环境变量
一.定义环境变量 添加环境分支 添加环境变量 切换环境分支 使用脚本设置环境变量 设置集合级别的变量 二.使用环境变量 使用{{变量名称}}的形式引用环境变量. 注:变量可以用在URL,请求参数,请求 ...
- vertica merge 优化
-- 查看RDS的订单数(MySQL) select count(*) from ( SELECT tid, IF(LOCATE('pay_time', jdp_response)=0 ...
- HBase过滤器(转载)
HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行 ...
- layui数据表格排序图标被超出的表头挤出去
如果表头过长,会出现超出显示三个省略号,然后把排序图标挤出去,看不到了, 效果如下 解决办法就是给图标加定位,过长的时候加上 .show-sort{ position: absolute; right ...
- SQL server 统计分组经计
SUM(A.AREA) OVER ( PARTITION BY A.ItemNo, A.PARTS ,A.WIDTH,A.HEIGHT) allotQty, SUM(A.SL) OVER ( PART ...
- 【HDOJ6701】Make Rounddog Happy(启发式合并)
题意:给定一个长为n的序列和k,定义子串[L,R](L<=R)合法当: 1.max(a[L]..a[R])-(R-L+1)<=k 2.[L,R]中没有重复的数字 问合法子串的个数 n,k, ...