是个好东西,可以处理在模数不互质的同余方程组

核心就是用扩欧来合并方程

如果我们有两个形如\(x\equiv b_1(mod\ a_1)\) \(x\equiv b_2(mod\ a_2)\)的方程我们要将他们合并

就是利用各种操作化柿子

\[x=a_1k_1+b_1=a_2k_2+b_2
\]

随便移一下

\[a_1k_1=b_2-b_1+a_2k_2
\]

根据贝祖定理\((a1,a2)|(b_2-b_1)\)时候才有解

如果有解得话,我们只需要在两边除以\((a1,a2)\)

那么就有

\[\frac{a_1k_1}{(a_1,a_2)}=\frac{b_2-b_1}{(a_1,a_2)}+\frac{a_2k_2}{(a_1,a_2)}
\]

我们也可以写成同余的形式

\[\frac{a_1k_1}{(a_1,a_2)}\equiv \frac{b_2-b_1}{(a_1,a_2)}(mod\ \frac{a_2}{(a_1,a_2)})
\]

让左边只留下\(k_1\),就是把逆元乘过去

\[k_1\equiv inv(\frac{a_1}{(a_1,a_2)},\frac{a_2}{(a_1,a_2)})*\frac{b_2-b_1}{(a_1,a_2)}(mod\ \frac{a_2}{(a_1,a_2)})
\]

再将同余式写成等式

\[k_1=inv(\frac{a_1}{(a_1,a_2)},\frac{a_2}{(a_1,a_2)})*\frac{b_2-b_1}{(a_1,a_2)}+\frac{a_2}{(a_1,a_2)}*y
\]

再回带到\(x\)里去

\[x=inv(\frac{a_1}{(a_1,a_2)},\frac{a_2}{(a_1,a_2)})*\frac{b_2-b_1}{(a_1,a_2)}*a_1+\frac{a_2a_1}{(a_1,a_2)}*y+b_1
\]

现在我们再写成同余式

\[x\equiv inv(\frac{a_1}{(a_1,a_2)},\frac{a_2}{(a_1,a_2)})*\frac{b_2-b_1}{(a_1,a_2)}*a_1\%\frac{a_2}{(a_1,a_2)}+b_1(mod\ \frac{a_1a_2}{(a_1,a_2)})
\]

现在两个方程不就被合并好了吗

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 100005
#define LL long long
LL x,y;
LL gcd(LL a,LL b)
{
if(!b) return a;
return gcd(b,a%b);
}
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(!b) return x=1,y=0,a;
LL r=exgcd(b,a%b,y,x);
y-=a/b*x;
return r;
}
int n;
LL a[maxn],b[maxn];
inline LL read()
{
char c=getchar();
LL x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
inline LL inv(LL a,LL b)
{
LL r=exgcd(a,b,x,y);
LL t=b/r;
return (x%t+t)%t;
}
inline LL mul(LL a,LL b)
{
LL S=0;
while(b)
{
if(b&1ll) S=S+a;
b>>=1ll;
a=a+a;
}
return S;
}
void write(LL x)
{
if(x>9) write(x/10);
putchar(x%10+48);
}
int main()
{
n=read();
for(re int i=1;i<=n;i++)
a[i]=read(),b[i]=read();
LL r=gcd(a[1],a[2]);
LL A=mul(a[1],a[2]/r);
LL B=(inv(a[1]/r,a[2]/r)*(b[2]-b[1])/r%(a[2]/r)+a[2]/r)%(a[2]/r)*a[1]+b[1];
for(re int i=3;i<=n;i++)
{
LL r=gcd(A,a[i]);
B=(inv(A/r,a[i]/r)*(b[i]-B)/r%(a[i]/r)+a[i]/r)%(a[i]/r)*A+B;
A=mul(A,a[i]/r);
}
write(B);
return 0;
}

EXCRT的更多相关文章

  1. X问题 HDU - 1573(excrt入门题)

    X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  2. CRT和EXCRT学习笔记

    蒟蒻maomao终于学会\(CRT\)啦!发一篇博客纪念一下(还有防止忘掉) \(CRT\)要解决的是这样一个问题: \[x≡a_1​(mod m_1​)\] \[x≡a_2​(mod m_2​)\] ...

  3. 扩展中国剩余定理 (exCRT) 的证明与练习

    原文链接https://www.cnblogs.com/zhouzhendong/p/exCRT.html 扩展中国剩余定理 (exCRT) 的证明与练习 问题模型 给定同余方程组 $$\begin{ ...

  4. P4777 【模板】扩展中国剩余定理(EXCRT)/ poj2891 Strange Way to Express Integers

    P4777 [模板]扩展中国剩余定理(EXCRT) excrt模板 我们知道,crt无法处理模数不两两互质的情况 然鹅excrt可以 设当前解到第 i 个方程 设$M=\prod_{j=1}^{i-1 ...

  5. 「NOI2018」屠龙勇士(EXCRT)

    「NOI2018」屠龙勇士(EXCRT) 终于把传说中 \(NOI2018D2\) 的签到题写掉了... 开始我还没读懂题目...而且这题细节巨麻烦...(可能对我而言) 首先我们要转换一下,每次的 ...

  6. Luogu4774 NOI2018 屠龙勇士 ExCRT

    传送门 原来NOI也会出裸题啊-- 用multiset求出对付每一个BOSS使用的武器威力\(ATK_i\),可以得到\(m\)个式子\(ATK_ix \equiv a_i \mod p_i\) 看起 ...

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

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

  8. P4777 【模板】扩展中国剩余定理(EXCRT)

    思路 中国剩余定理解决的是这样的问题 求x满足 \[ \begin{matrix}x \equiv a_1(mod\ m_1)\\x\equiv a_2(mod\ m_2)\\ \dots\\x\eq ...

  9. BZOJ5418 NOI2018屠龙勇士(excrt)

    显然multiset求出每次用哪把剑.注意到除了p=1的情况,其他数据都保证了ai<pi,于是先特判一下p=1.比较坑的是还可能存在ai=pi,稍微考虑一下. 剩下的部分即解bix≡ai(mod ...

  10. CRT && exCRT模板

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

随机推荐

  1. linux 卡在进度条进不去解决办法之一

    centos为例 一, 如下: 如果这个地方卡住了的话也许是你上次改了passwd文件,这个是其中一个情况. 如果刚刚开机就卡住了或者怎么卡住了的话在开机的读条时候摁esc显示读取的进程,根据显示的错 ...

  2. PyCharm常见用法

    1.设置python运行版本: File-->Setting-->Project-->Project Interpreter 2.代码批量左移/右移一个tab: 鼠标选中行,Tab右 ...

  3. VMware虚拟机上安装xp操作系统

    前提:安装好虚拟机 资料:windows xp 的虚拟机操作系统 上面这个文件最好保存好一份,防止以后虚拟机用坏了可以重新安装. 1 新建目录D:\virtual machine\vSQL\vm将我们 ...

  4. Grafana监控可视化环境搭建

    依赖库Go 1.6NodeJS v4+sqlite3GO 环境搭建 vi /etc/profile export GOPATH="/root/go" export GOROOT=& ...

  5. [LeetCode]25. Reverse Nodes in k-Group k个一组翻转链表

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k ...

  6. 编程语言的发展历史剧。(参考https://baijiahao.baidu.com/s?id=1588675986991787716&wfr=spider&for=pc)

    1800年 约瑟夫·玛丽·雅卡尔(Joseph Marie Jacquard),设计出人类历史 上首台可设计织布机——雅卡尔织布机,对将来发展出其他可编程机器起了重要作用 1842年 阿达·洛夫莱斯( ...

  7. 富文本编辑框和防止xss攻击

    一.后台管理页面构建 1.创建后台管理url urlpatterns = [ ... # 后台管理url re_path("cn_backend/$", views.cn_back ...

  8. 集合的前N个元素

    集合的前N个元素:编一个程序,按递增次序生成集合M的最小的N个数,M的定义如下:     (1)数1属于M:     (2)如果X属于M,则Y=2*x+1和Z=3*x+1也属于M:     (3)此外 ...

  9. <Android 应用 之路> 简易手电筒

    前言 快一个月没有写自己的博客了,由于最近换了工作,换了居住地,所以有一些杂事需要处理,从今天开始恢复正常,不赘述了.进入今天的主题 -– 简易的手电筒. 这个Demo中使用的是比较新的API,M版本 ...

  10. C++基础--static的用法

    首先,看看变量的存储: int global ; int main() { int stackStore ; int heapStore* = (int *)malloc(sizeof(int)); ...