中国剩余定理

别人的blog

假设现在有关于x的同余方程组(p1,p2均为质数)

\(x=a_1\pmod {p_1}\)

\(x=a_2\pmod {p_2}\)

可以转化成如下形式

\(x=a_1+k_1p_1\)

\(x=a_2+k_2p_2\)

联立就有\(a_1+k_1p_1=a_2+k_2p_2\)

显然可以扩欧求一组特解,设为\(k_1',k_2'\)

那么全部的解可以表示成

\(k_1=k_1'+p_2t\)

\(k_2=k_2'+p_1t\)

其中t为整数

回带就有\(x=a_1+(k_1'+p_2t)p_1=a_1+p_1k_1'+p_1p_2t\)

设\(x_0=a_1+p_1k_1'\)就有\(x=x_0\pmod{p_1p_2}\)

那么如果有多组方程,我们就可以按照上面的方法合并方程,最后只剩一个

即\(x=x_0\pmod{p_1p_2...p_n}\)

例题1[TJOI2009]猜数字

例题2曹冲养猪

#define ll long long
#include<bits/stdc++.h>
using namespace std;
int n;
ll a[20],b[20];
void exgcd(ll a,ll b,ll&x,ll&y){
if(!b){x=1,y=0;return;}
exgcd(b,a%b,x,y);
ll t=x;x=y;y=t-a/b*y;
}
ll crt(){
ll A=a[1],B=b[1],x,y;
for(int i=2;i<=n;i++){
exgcd(A,a[i],x,y);
x*=((b[i]-B)%a[i]+a[i])%a[i];//不定方程ax+by=c两边同时加上b的倍数,x的结果不改变
B+=A*x;A*=a[i];B=(B%A+A)%A;//注意到x有可能为负,所以每次把B模一下A把负的转成正的
}
return B;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i]>>b[i];
cout<<crt()<<endl;
return 0;
}

扩展CRT

用于解决模数不互质的情况(这么多ex都是模数不互质...),

还是先考虑两个方程

\(x_1=a_1\pmod {m_1}\)

\(x_2=a_2\pmod {m_2}\)

联立得\(a_1+k_1m_1=a_2+k_2m_2\)

当\(gcd(m_1,m_2)\)不整除\((a_1-a_2)\)时是无解的

如果有解,那么可以改成\(\frac{a_1-a_2}{gcd(m_1,m_2)}=k_2\frac{m_2}{gcd(m_1,m_2)}-k_1\frac{m_1}{gcd(m_1,m_2)}\)

继续exgcd求解,按照CRT的推法,最终能得到\(x=x_0\pmod{lcm(m_1,m_2,...,m_n)}\)

[模板]扩展中国剩余定理

#define ll long long
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
ll re(){
ll x=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
int n;
ll a[N],m[N];
ll exgcd(ll a,ll b,ll&x,ll&y){
if(!b){x=1,y=0;return a;}
ll g=exgcd(b,a%b,x,y);
ll t=x;x=y;y=t-a/b*y;
return g;
}
ll ksc(ll x,ll y,ll p){
ll s=0;
while(y){
if(y&1)s=(s+x)%p;
x=(x+x)%p;
y>>=1;
}
return s;
}
ll excrt(){
ll M=m[1],A=a[1],d,a1,b1,g,x,y;
for(int i=2;i<=n;i++){
a1=M,b1=m[i],d=((a[i]-A)%b1+b1)%b1;
g=exgcd(a1,b1,x,y);
x=ksc(x,d/g,b1);A+=x*M;M=M*(b1/g);
A=(A%M+M)%M;
}
return (A%M+M)%M;
}
int main(){
n=re();
for(int i=1;i<=n;i++)
m[i]=re(),a[i]=re();
printf("%lld\n",excrt());
return 0;
}

[note]CRT&exCRT的更多相关文章

  1. [笔记] CRT & exCRT

    [笔记] CRT & exCRT 构造法 求多组\(x \equiv r_i (\bmod d_i)\)的解,\(d_i\)互质 余数\((r_i = remainder)\),除数\((d_ ...

  2. CRT&EXCRT 中国剩余定理及其扩展

    前言: 中国剩余定理又名孙子定理.因孙子二字歧义,常以段子形式广泛流传. 中国剩余定理并不是很好理解,我也理解了很多次. CRT 中国剩余定理 中国剩余定理,就是一个解同余方程组的算法. 求满足n个条 ...

  3. CRT && exCRT模板

    CRT从各种方面上都吊打exCRT啊...... 短,好理解... 考虑构造bi使得bi % pi = ai,bi % pj = 0.然后全加起来就行了. 显然bi的构造就是ai * (P/pi) * ...

  4. crt,excrt学习总结

    \(crt,Chinese\ Remainder\ Theorem\) 概述 前置技能:同余基础性质,\(exgcd\). \(crt\),中国剩余定理.用于解决模数互质的线性同余方程组.大概长这样: ...

  5. CRT & EXCRT 学习笔记

    这玩意解决的是把同余方程组合并的问题. CRT的核心思想和拉格朗日插值差不多,就是构造一组\(R_i\)使得$\forall i,j(i \neq j) $ \[R_im_i = 1, R_im_j ...

  6. CRT&EXCRT学习笔记

    非扩展 用于求解线性同余方程组 ,其中模数两两互质 . 先来看一看两个显然的定理: 1.若 x \(\equiv\) 0 (mod p) 且 y \(\equiv\) 0 (mod p) ,则有 x+ ...

  7. BZOJ 3782: 上学路 Lucas+ExCRT+容斥+dp

    其实呢,扩展中国剩余定理还有一种理解方式:就是你有一坨东西,形如:$A[i]\equiv B[i](mod$ $P[i])$. 对于这个东西,你可以这么思考:如果最后能求出一个解,那么这个解的增量一定 ...

  8. BZOJ 1951: [Sdoi2010]古代猪文 ExCRT+欧拉定理+Lucas

    欧拉定理不要忘记!! #include <bits/stdc++.h> #define N 100000 #define ll long long #define ull unsigned ...

  9. NOIp2018停课刷题记录

    Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...

随机推荐

  1. 渗透测试中的文件传输通道1- cmd下下载文件

    Set xPost = createObject("Microsoft.XMLHTTP")xPost.Open "GET","http://www.x ...

  2. hdu 5365 Run(BC 50 B题)(求四边形的个数)

    本来准备睡觉.结果还是忍不住想把它A了.由于已经看了题解了, 题意:就是给你一些坐标.都是整数,求一些正多边形的数目,官方题讲解是地球人都知道整数坐标构不成正三角形.正五边形和正六边形的... 然而我 ...

  3. 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。

    “Win32Project3.exe”(Win32): 已加载“D:\software\VS2013\VS2013 文档\Win32Project3\Debug\Win32Project3.exe”. ...

  4. 1通过URL对象的openStream()方法能够得到指定资源的输入流。

    通过URL读取网页内容     1通过URL对象的openStream()方法能够得到指定资源的输入流.     2通过输入流能够读取.訪问网络上的数据.     案例: import java.io ...

  5. CentOS6.8 安装FTP及添加用户

    一 安装FTP 1 检测是否已经安装FTP rpm -qa | grep vsftpd 2 若没有,则进行安装 yum install vsftpd 二 设置vsftpd开机启动 chkconfig ...

  6. UIView的endEditing:方法

    当视图收到endEditing:消息时,如果视图(或者其下的人和子视图)是当前的第一响应对象,就会取消自己的第一响应对象状态, 而且虚拟键盘也会消失(传入的参数代表是否需要强制取消第一响应对象状态.有 ...

  7. Python---copy()、deepcopy()与赋值的区别

    copy()与deepcopy()之间的主要区别是python对数据的存储方式. 首先直接上结论: —–深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在.所以改变原有被复制对象不会对已经复 ...

  8. windows 网站迁移到linux

    从windows迁移网站到linux 发现乱码 出现这种情况的原因为两种操作系统的中文压缩方式不同,在windows环境中中文一般为gbk,而在linux环境中为utf8,这就导致了在windows下 ...

  9. 无需Root实现Android手机屏幕流畅投影到电脑进行演示(附软件下载)

    近期要在公司的会议上演示App,须要在投影仪上显示出来给大家演示.因为投影仪不是智能投影仪,仅仅能将App先投影到自己的笔记本上.然后再将笔记本上的内容投影到投影仪上.该App是个游戏,实时交互性比較 ...

  10. PHP array_walk() 函数

    定义和用法 array_walk() 函数对数组中的每个元素应用用户自定义函数.在函数中,数组的键名和键值是参数. <?php function myfunction($value,$key,$ ...