【CRT】中国剩余定理简介
中国剩余定理(CRT)
中国剩余定理出自中国的某本古书,似乎是孙子兵法?(雾
其中有这样一个问题:
有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
即,对于这样一个方程组:
\]
我们已知所有\(a_i,m_i\),求可行解\(x\),可以证明的是,若所有\(m_i\)互质,那么该方程组有唯一解。
可以构造出一个解:如果有\(k\)个方程,设\(M=\prod_{i=1}^k m_i,n_i=\frac{M}{m_i}\),则有\(x=\sum_{i=1}^k a_in_in_i^{-1}\pmod{M}\)。
扩展中国剩余定理(EXCRT)
扩展中国剩余定理不要求\(m_i\)互质,其结论是由数学归纳法得出的,跟CRT实际上没太大关系。这种情况下,方程组的解是不唯一的。
首先考虑两个方程的情况。
假设我们有\(x\equiv a_1\pmod{m_1},x\equiv a_2\pmod{m_2}\),那么显然\(x+m_1*t_1=a_1,x+m_2*t_2=a_2\),其中\(t_i\)为未知数。得出\(a_1-a_2=m_1*t_1-m_2*t_2\),根据\(Bezout\)定理,若\(gcd(m_1,m_2)\mid (a_1-a_2)\),该方程有解。那么我们就可以求出两个方程的情况下的一个解了。
然后考虑多个方程。
假设前\(k-1\)个方程的解为\(x\),记\(m=lcm(m_1,m_2,m_3\cdots,m_{k-1})\),那么显然前\(k-1\)个方程的通解是\(x+i*m,i\in \mathbb{Z}\)。为什么要最小公倍数呢?显然最小公倍数中包含了前\(k-1\)个数中出现的所有因子,因此\(x\)加上任意倍的\(m\)对任意的\(m_i\)取模答案不变,所以其实把前\(k-1\)个\(m_i\)全部乘起来当作\(m\)也不是不可以。而对于第\(k\)个方程,我们既要使得解对前\(k-1\)个方程成立,因此我们取某前\(k-1\)个方程的某个通解,又要使解对第\(k\)个方程成立,因此我们要使\(x+i*m\equiv a_k\pmod{m_k}\)。
现在看到这个方程,\(x+i*m\equiv a_k\pmod{m_k}\),可以化为\(i*m\equiv a_k-x\pmod{m_k}\)我们要求解它,就是求解一个线性同余方程,可以用扩展欧几里得算法得出解。显然,假设前\(k\)个方程的解为\(x'\),那么\(x'=x+i*m\)。
于是我们对方程组进行\(k\)次扩展欧几里得,就可以得出前\(k\)个方程的解。
洛谷上板子取模比较神奇,贴一下代码:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#define ll long long
using namespace std;
inline ll read()
{
ll f=1,x=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
inline ll mul(ll a,ll b,ll p)
{
ll ans=0;
for(;b;b>>=1){
if(b&1) ans=(ans+a)%p;
a=(a+a)%p;
}
return ans;
}
inline 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,x,y);
ll z=x;x=y;y=z-y*(a/b);
return d;
}
int n;
int main()
{
n=read();
ll M,gcd,ans=0,x0,y0;
M=read(),ans=read();//第一个方程的最小非负整数解就是它自己
for(register int i=2;i<=n;++i){
ll a,m;
m=read(),a=read();
gcd=exgcd(M,m,x0,y0);
ll k=m/gcd;
x0=mul(x0,((a-ans%m+m)%m)/gcd,m);//至今不知道为什么可以取模
ans+=M*x0;
M*=k;
ans=(ans%M+M)%M;
}
printf("%lld",(ans%M+M)%M);
return 0;
}
【CRT】中国剩余定理简介的更多相关文章
- CRT中国剩余定理 & Lucas卢卡斯定理
数论_CRT(中国剩余定理)& Lucas (卢卡斯定理) 前言 又是一脸懵逼的一天. 正文 按照道理来说,我们应该先做一个介绍. 中国剩余定理 中国剩余定理,Chinese Remainde ...
- CRT&EXCRT 中国剩余定理及其扩展
前言: 中国剩余定理又名孙子定理.因孙子二字歧义,常以段子形式广泛流传. 中国剩余定理并不是很好理解,我也理解了很多次. CRT 中国剩余定理 中国剩余定理,就是一个解同余方程组的算法. 求满足n个条 ...
- [SDOI2010] 古代猪文 (快速幂+中国剩余定理+欧拉定理+卢卡斯定理) 解题报告
题目链接:https://www.luogu.org/problemnew/show/P2480 题目背景 “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色 ...
- 中国剩余定理 CRT
中国剩余定理 CRT 正常版本CRT 要解的是一个很容易的东西 \[ \begin{aligned} x\equiv a_1(mod\ m_1)\\ x\equiv a_2(mod\ m_2)\\ . ...
- 扩展中国剩余定理(扩展CRT)详解
今天在$xsy$上翻题翻到了一道扩展CRT的题,就顺便重温了下(扩展CRT模板也在里面) 中国剩余定理是用于求一个最小的$x$,满足$x\equiv c_i \pmod{m_i}$. 正常的$CRT$ ...
- 欧几里得(辗转相除gcd)、扩欧(exgcd)、中国剩余定理(crt)、扩展中国剩余定理(excrt)简要介绍
1.欧几里得算法(辗转相除法) 直接上gcd和lcm代码. int gcd(int x,int y){ ?x:gcd(y,x%y); } int lcm(int x,int y){ return x* ...
- 中国剩余定理(CRT)及其拓展(ExCRT)
中国剩余定理 CRT 推导 给定\(n\)个同余方程 \[ \left\{ \begin{aligned} x &\equiv a_1 \pmod{m_1} \\ x &\equiv ...
- 中国剩余定理(crt)和扩展中国剩余定理(excrt)
数论守门员二号 =.= 中国剩余定理: 1.一次同余方程组: 一次同余方程组是指形如x≡ai(mod mi) (i=1,2,…,k)的同余方程构成的组 中国剩余定理的主要用途是解一次同余方程组,其中m ...
- 中国剩余定理及其拓展 CRT&EXGCD
中国剩余定理,又叫孙子定理. 作为一个梗广为流传.其实它的学名叫中国单身狗定理. 中国剩余定理 中国剩余定理是来干什么用的呢? 其实就是用来解同余方程组的.那么什么又是同余方程组呢. 顾名思义就是n个 ...
随机推荐
- Eureka客户端源码流程梳理
前面梳理了Eureka服务端的流程,现在整理下客户端的流程. 1.在这个包(spring-cloud-netflix-eureka-client)里面寻找客户端启动入口相关配置,关键配置文件sprin ...
- Mysql sqlyog 错误1045
首先打开运行窗口输入cmd进入DOS界面或者打开MySQL Workbench Step1: cd C:\Program Files\MySQL\MySQL Server 5.6\bin Step2: ...
- C++ 优先队列priority_queue用法【转载】
priority_queue 对于基本类型的使用方法相对简单.他的模板声明带有三个参数,priority_queue<Type, Container, Functional>Type 为数 ...
- Python:使用第三方库xlwt来写Excel
继上一篇文章使用xlrd来读Excel之后,这一篇文章就来介绍下,如何来写Excel,写Excel我们需要使用第三方库xlwt,和xlrd一样,xlrd表示read xls,xlwt表示write x ...
- Matlab R2017b 打开后一直显示“正在初始化”,导致无法运行命令
1. 前言 Matlab R2017b打开后一直显示"正在初始化",导致无法运行命令. 2. 解决方案 1. 找到并记录授权文件license_standalone.lic的路径. ...
- Visual Studio Code 中实现 C++ 函数定义跳转和代码自动补全功能(25)
方法1: 1.1 安装插件 C++ Intellisense 名称: C++ Intellisense id: austin.code-gnu-global 说明: C/C++ Intellisens ...
- OSI七层模型对应功能及协议
前言 OSI七层模型:纯理论模型,所有实际设备和协议都不能对应理论模型. 每一层对应着实际的设备 物理层:中继器.集线器.双绞线 数据链路层:网桥.以太网交换机.网卡 网路层:路由器.三层交换机 传输 ...
- 模板模式(Template Pattern)
模板模式(Template Pattern) -- 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. ...
- Spring Cloud Alibaba学习笔记(8) - RocketMQ术语与概念
Topic 一类消息的集合,RocketMQ的基本订阅单位 部署结构 Name Server Name Server 为 producer 和 consumer 提供路由信息. 相对来说,namese ...
- Markdown笔记(git提交带有emoji的commit描述)
用法:> git commit -m ' :tada: initial ' emoji来源:> ![gitmoji](https://gitmoji.carloscuesta.me/sta ...