传送门
题目大意
求解模方程组
题解
- 是中国剩余定理的裸体
- 但是我并不想用中国剩余定理,因为它只适用于模数互质
- ydcydc数学
- 参见里面的 将中国剩余定理丢进垃圾桶
ansmoda1=b1 ansmoda2=b2
a1⋅x+b1=a2⋅y+b2
用扩欧求解一个x,令b=x⋅a1+b1,a=lcm(a1,a2),则将方程合并为了
xmoda=b
代码
var
d,e:array[0..20]of int64;
i,j:longint;
n:longint;
a,b,c,x,y,t,v:int64;
function gcd(a,b:int64):int64;
begin
if b=0
then gcd:=a
else gcd:=gcd(b,a mod b);
end;
function lcm(a,b:int64):int64;
begin
lcm:=(a*b)div gcd(a,b);
end;
procedure exgcd(a,b:int64; var x,y:int64);
var t:longint;
begin
if b=0
then begin x:=1; y:=0; end
else begin exgcd(b,a mod b,x,y); t:=x; x:=y; y:=t-y*(a div b); end;
end;
begin
readln(n);
for i:=1 to n do
readln(d[i],e[i]);
for i:=1 to n-1 do
{x*d[i]+e[i]=y*d[i+1]+e[i+1]}
{x*d[i]+y*(-d[i+1])=e[i+1]-e[i]}
begin
a:=d[i]; b:=d[i+1]; c:=e[i+1]-e[i];
{a*x+b*y=c}
t:=gcd(a,b);
a:=a div t; b:=b div t; c:=c div t;
exgcd(a,b,x,y);
x:=x*c div t;
v:=x*t div b;
x:=x-v*b div t;
if x<0 then x:=x+b div t;
x:=(x+b)mod b;
d[i+1]:=lcm(d[i],d[i+1]); e[i+1]:=x*d[i]+e[i];
end;
writeln(e[n]);
end.