[vijos1164] 曹冲养猪

传送门

https://vijos.org/p/1164

题目大意

求解模方程组

题解


  • 是中国剩余定理的裸体
  • 但是我并不想用中国剩余定理,因为它只适用于模数互质
  • ydcydc数学
  • 参见里面的 将中国剩余定理丢进垃圾桶

ansmoda1=b1   ansmoda2=b2
a1x+b1=a2y+b2
x,b=xa1+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.

你可能感兴趣的:(数论—中国剩余定理)