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.

Download