INTEGER7 - Số nguyên
Tác giả: flashmt
Ngôn ngữ: Pascal
const fi='';
fo='';
type int64=longint;
var a,b,c,d,x,y:int64;
procedure rf;
begin
assign(input,fi);
reset(input);
read(a,c,b,d);
close(input);
end;
function getmax(a,b:int64):int64;
begin
if a>b then getmax:=a else getmax:=b;
end;
function gcd(m,n:int64):int64;
begin
m:=abs(m); n:=abs(n);
repeat
if m>n then m:=m mod n
else n:=n mod m;
until m*n=0;
gcd:=m+n;
end;
procedure swap(var a,b:int64);
var t:int64;
begin
t:=a; a:=b; b:=t;
end;
procedure findroot(a,b:int64;var x0,y0:int64);
var r,q,xt,yt,x1,y1:int64;
begin
x0:=1; y0:=0;
x1:=0; y1:=1;
repeat
q:=a div b;
r:=a mod b;
a:=b; b:=r;
xt:=x0; yt:=y0;
x0:=x1; y0:=y1;
x1:=xt-q*x1; y1:=yt-q*y1;
until b=0;
end;
procedure pr;
var x0,y0,min,max,min1,max1:int64;
begin
c:=d-c;
if a=0 then
begin
x:=0;
y:=c div (-b);
exit;
end;
if b=0 then
begin
y:=0;
x:=c div a;
exit;
end;
d:=gcd(a,b);
a:=a div d;
b:=b div d;
c:=c div d;
findroot(a,b,x0,y0);
x0:=x0*c; y0:=y0*c;
if a*x0-b*y0<>c then
begin
if a*x0-b*(-y0)=c then y0:=-y0;
if a*(-x0)-b*y0=c then x0:=-x0;
if a*(-x0)-b*(-y0)=c then
begin
x0:=-x0;
y0:=-y0;
end;
end;
if (x0>=0) and (y0>=0) then
begin
max:=x0 div b;
max1:=y0 div a;
max:=getmax(max,max1);
x0:=x0-max*b;
y0:=y0-max*a;
end;
if (x0<0) and (y0<0) then
begin
max:=abs(x0) div b;
max1:=abs(y0) div a;
max:=getmax(max,max1);
x0:=x0+max*b;
y0:=y0+max*a;
end;
if (x0>=0) and (y0<0) then
begin
max:=abs(y0) div a;
x0:=x0+max*b;
y0:=y0+max*a;
end;
if (x0<0) and (y0>=0) then
begin
max:=abs(x0) div b;
x0:=x0+max*b;
y0:=y0+max*a;
end;
if (x0<0) or (y0<0) then
repeat
x0:=x0+b;
y0:=y0+a;
until (x0>=0) and (y0>=0);
x:=x0; y:=y0;
end;
procedure wf;
begin
assign(output,fo);
rewrite(output);
write(x,' ',y);
close(output);
end;
begin
rf;
pr;
wf;
end.