Loading

exCRT

\[\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;
}

posted @ 2023-01-12 10:23  hihihi198  阅读(54)  评论(0)    收藏  举报