\[\begin{aligned} &\begin{cases} x\equiv a_1\pmod{m_1}\\x\equiv a_2\pmod{m_2} \end{cases}\\ &x=pm_1+a_1=qm_2+a_2\\ &pm_1-qm_2=a_2-a_1 \end{aligned} \]
将其视为一个不定方程,用 exgcd 解出 \(p,q\) 的值。然后得出 \(x\) 的一个解。可得:
\[x\equiv pm_1+a_1\pmod{\text{lcm}(m_1,m_2)} \]所以可以将两个方程合并为一个。
#include<cstdio>
#include<algorithm>
using namespace std;
typedef __int128 ll;
ll exgcd(ll a,ll b,ll&x,ll&y){
if(!b){x=1;y=0;return a;}
ll d=exgcd(b,a%b,y,x);
y-=(a/b)*x;return d;
}
int main(){
int n;long long lla,llb;
scanf("%d%lld%lld",&n,&llb,&lla);
ll a1=lla,m1=llb,a2,m2,q1,q2,d;
for(int i=1;i<n;i++){
scanf("%lld%lld",&llb,&lla);
a2=lla;m2=llb;d=exgcd(m1,m2,q1,q2);
m2=m1*m2/d;a2=((q1*(a2-a1)/d*m1+a1)%m2+m2)%m2;a1=a2;m1=m2;
}
long long ans=a1;printf("%lld\n",ans);
return 0;
}
标签:int,ll,exCRT,pmod,llb,lla,equiv
From: https://www.cnblogs.com/hihihi198/p/17045731.html