AcWing 204. 表达整数的奇怪方式
#include<bits/stdc++.h> using namespace std; typedef long long 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; LL a1,m1; cin>>n>>a1>>m1; LL x=0; for(int i=1;i<n;i++) { LL a2,m2; cin>>a2>>m2; LL k1,k2; LL d=exgcd(a1,a2,k1,k2); if((m2-m1)%d) { x=-1; break; } k1*=(m2-m1)/d; LL t=abs(a2/d); k1=(k1%t+t)%t; m1=k1*a1+m1; a1=abs(a1*a2/d); } if(x!=-1) x=(m1%a1+a1)%a1; printf("%lld\n",x); return 0; }
给定 2n 个整数a1,a2,…,an和m1,m2,…,mn,求一个最小的非负整数 x,满足∀i∈[1,n],x≡mi(mod ai)。