ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

扩展中国剩余定理(EXCRT)小记

2020-11-06 08:03:48  阅读:230  来源: 互联网

标签:方程 定理 Mx EXCRT ans equiv 小记 LL define


前言

其实\(EXCRT\)也并不像想象中那么难嘛。

记得之前学的时候翻了好多博客都看不懂,现在可能是因为找到一篇通俗易懂的题解,一下就把这个算法搞明白了。

同余方程

给定一个如下形式的方程:

\[\begin{cases} x\equiv b_1(\texttt{mod}\ a_1)\\ x\equiv b_2(\texttt{mod}\ a_2)\\ \vdots\\ x\equiv b_n(\texttt{mod}\ a_n) \end{cases} \]

与\(CRT\)不同的是,\(EXCRT\)可以求解\(a_1,a_2,...,a_n\)不互质的情况。

算法流程

考虑我们从左向右扫,维护前\(i-1\)个同余方程的答案\(ans\)以及前\(i-1\)个\(a\)的最小公倍数\(M\)。

现在我们要修改\(ans\)让它在依然满足前\(i-1\)个方程的同时满足第\(i\)个方程。

发现只要我们给\(ans\)加上的数是\(M\)的倍数,它就必然依旧满足前\(i-1\)个方程。

于是我们考虑列出一个不定方程:

\[ans+Mx=b_i+a_iy \]

移项得到:

\[Mx-a_iy=b_i-ans \]

这里由于我们并不需要知道\(y\)的具体值,其实也可以写成\(Mx+a_iy=b_i-ans\),主要看个人习惯。

至于这个方程明显是可以\(exgcd\)求解的。

然后只要给\(ans\)加上\(Mx\),更新\(M\)为\(lcm(M,a_i)\),继续做下去就好了。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define LL long long
#define N 100000
using namespace std;
int n;LL a[N+5],b[N+5];
I LL QM(LL x,LL y,LL X) {LL k=(1.0L*x*y)/X,t=x*y-k*X;t-=X;W(t<0) t+=X;return t;}//快速乘
I LL exgcd(LL x,LL y,LL& a,LL& b) {LL g;return y?(g=exgcd(y,x%y,b,a),b-=a*(x/y),g):(a=1,b=0,x);}//exgcd解不定方程
int main()
{
	RI i;for(scanf("%d",&n),i=1;i<=n;++i) scanf("%lld%lld",a+i,b+i);
	LL ans=b[1],M=a[1],g,A,B;for(i=2;i<=n;++i) A=B=0,g=exgcd(M,a[i],A,B),//ans维护答案,M维护lcm
		ans+=QM(A,(b[i]-ans%a[i]+a[i])%a[i]/g,a[i]/g)*M,M*=a[i]/g,ans=(ans%M+M)%M;//更新ans和M,注意先更新M再取模
	return printf("%lld\n",ans),0;
}

标签:方程,定理,Mx,EXCRT,ans,equiv,小记,LL,define
来源: https://www.cnblogs.com/chenxiaoran666/p/EXCRT.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有