拓展中国剩余定理

前言

记得半年前还写过关于拓展中国剩余定理的博客。。。不过那时对其理解还不是比较深刻,写的也比较乱。

于是趁学校复习之机,再来重温一下拓展中国剩余定理(以下简称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++实现,拓展中国剩余定理——解同余方程组(理论证明和代码实现)的更多相关文章

  1. 拓展中国剩余定理(exCRT)摘要

    清除一个误区 虽然中国剩余定理和拓展中国剩余定理只差两个字,但他俩的解法相差十万八千里,所以会不会CRT无所谓 用途 求类似$$\begin{cases}x \equiv b_{1}\pmod{a_{ ...

  2. E - Two Arithmetic Progressions(CodeForces - 710D)(拓展中国剩余定理)

    You are given two arithmetic progressions: a1k + b1 and a2l + b2. Find the number of integers x such ...

  3. 拓展中国剩余定理(ex_crt)

    一般来讲,crt(中国剩余定理)比较常见,而ex_crt(拓展中国剩余定理)不是很常用 但是noi 2018偏偏考了这么个诡异的东西... 所以这里写一个ex_crt模板 模型: 求一个x满足上述方程 ...

  4. poj2947(高斯消元法解同余方程组)

    题目链接:https://vjudge.net/problem/POJ-2065 题意:题目看着较复杂,实际上就是给了n个同余方程,解n个未知数. 思路:套高斯消元法的模板即可. AC代码: #inc ...

  5. (模板)poj2947(高斯消元法解同余方程组)

    题目链接:https://vjudge.net/problem/POJ-2947 题意:转换题意后就是已知m个同余方程,求n个变量. 思路: 值得学习的是这个模板里消元用到lcm的那一块.注意题目输出 ...

  6. luogu4777[模板]拓展中国剩余定理题解

    题目链接 https://www.luogu.org/problemnew/show/P4777 分析 扩展\(CRT\)就是解决模数不互质的情况,说是扩展\(CRT\),其实都是扩欧... 先来考虑 ...

  7. 2019牛客暑期多校训练营(第十场) Han Xin and His Troop (高精度+拓展中国剩余定理)

    题意 裸题 思路 题中的模数之间并不互质,所以应该用拓展中国剩余定理. 但是交上去会炸,__int128过不了,所以用高精度的板子或者java大数都挺好过的. 这里推荐java大数,因为高精度板子用起 ...

  8. poj 2947 Widget Factory (高斯消元解同余方程组+判断无解、多解)

    http://poj.org/problem?id=2947 血泪史: CE:poj的string类型要加string库,swap不能直接交换数组 WA: x[m-1]也有可能<3啊O(≧口≦) ...

  9. hdu 5755 Gambler Bo (高斯消元法解同余方程组)

    http://acm.hdu.edu.cn/showproblem.php?pid=5755 题意: n*m矩阵,每个格有数字0/1/2 每选择一个格子,这个格子+2,4方向相邻格子+1 如何选择格子 ...

随机推荐

  1. Docker拷贝宿主机与容器中的文件

    如果我们需要将宿主机文件拷贝到容器内可以使用 docker cp 命令,也可以将文件从容器内拷贝到宿主机 将宿主机文件拷贝到容器内 docker cp 要拷贝的宿主机文件或目录 容器名称:容器文件或目 ...

  2. .net 敏捷开发框架7.0.3 旗舰版

    联系QQ:1516462411 索取

  3. nmbd - 向客户端提供构造在IP之上的NetBIOS名字服务的NetBIOS名字服务器

    总览 SYNOPSIS nmbd [-D] [-F] [-S] [-a] [-i] [-o] [-h] [-V][-d <debug level>] [-H <lmhosts fil ...

  4. nice - 改变执行程序的优先级

    总览 (SYNOPSIS) nice [OPTION]... [COMMAND [ARG]...] 描述 (DESCRIPTION) 以 调整过的 调度优先级 运行 COMMAND. 如果 没给出 C ...

  5. 利用描述符自定义property

    class Lazyproperty: def __init__(self,func): #传的func函数是被描述的类中的函数属性 self.func = func def __get__(self ...

  6. zookeeper分布式之学习搭建

    一.下载: 下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/  下载解压到 C:\Users\Administrator\Desk ...

  7. Codeforces Round #567 (Div. 2)B. Split a Number (字符串,贪心)

    B. Split a Number time limit per test2 seconds memory limit per test512 megabytes inputstandard inpu ...

  8. Attention Points

    Attention Points 数组范围 无向图.树,边表的范围是边数的两倍. 因为最近树的题目做的比较多,一定要注意分清是树还是图,不能冲上去就去开struct Edge{int to,ne,w; ...

  9. 1px像素问题(移动端经典问题)

    1.物理像素:移动设备出厂时,不同设备自带的不同像素,也称硬件像素: 逻辑像素:即css中记录的像素 在开发中,为什么移动端CSS里面写了1px,实际上看起来比1px粗:了解设备物理像素和逻辑像素的同 ...

  10. linux运维、架构之路-MHA高可用方案

    一.软件介绍          MHA(master high   availability)目前是MySQL高可用方面是一个相对成熟的解决方案.在切换过程中,mha能做到0-30s内自动完成数据库的 ...