program dalikliai_ir_kartotiniai;
  { 64 u‘davinys }

  function dbdf (x, y : integer) : integer;
    { randa skai‡i— x ir y bendr…j¨ did‘iausi… dalikl¨ }
  begin
    if x = 0
       then dbdf := y
       else dbdf := dbdf (y mod x, x);
  end;

  function mbkf (x, y : integer) : integer;
    { randa skai‡i— x ir y bendr…j¨ ma‘iausi… kartotin¨ }
  begin
    mbkf := x div dbdf (x, y) * y
  end;

  procedure netruksta (var a, b, dbd, mbk : integer);
    { jei ‘inomi visi skai‡iai, patikrina, ar jie teisingi }
  begin
    if (dbdf (a, b) <> dbd) or (mbkf (a, b) <> mbk)
       then begin  { skai‡iai nekorekti˛ki }
              a := 0; b := 0;
              dbd := 0; mbk := 0;
            end;
  end;

  procedure vienas (var a, b, dbd, mbk : integer);
    { atstato skai‡ius, kai ne‘inomas vienas skai‡ius }
  begin
    { atstatysime tr–kstam… skai‡i— }
    if a = 0
       then a := mbk div b * dbd
       else if b = 0
               then b := mbk div a * dbd
               else if dbd = 0
                       then dbd := dbdf (a, b)
                       else mbk := mbkf (a, b);
    { patikrinsime, ar pavyko atstatyti }
    netruksta (a, b, dbd, mbk);
  end;

  procedure du (var a, b, dbd, mbk : integer);
    { atstato skai‡ius, kai ne‘inomi du skai‡iai }
  begin
    if (a = 0) and (b = 0)
       then begin
              a := dbd;
              b := mbk div a * dbd;
            end
       else if (dbd = 0) and (mbk = 0)
               then begin
                      dbd := dbdf (a, b);
                      mbk := mbkf (a, b);
                     end
       else if mbk = 0
               then begin
                      if a = 0
                         then a := dbd
                         else b := dbd;
                       mbk := mbkf (a, b);
                    end
       else begin
              if a = 0
                 then a := mbk
                 else b := mbk;
              dbd := dbdf (a, b);
            end;
    { patikrinsime, ar pavyko atstatyti }
    netruksta (a, b, dbd, mbk);
  end;

  procedure trys (var a, b, dbd, mbk : integer);
    { atstato skai‡ius, kai ne‘inomi trys skai‡iai }
    var zin : integer;
  begin
    { randame ‘inom… skai‡i— }
    zin := a + b + dbd + mbk;
    a := zin; b := zin;
    dbd := zin; mbk := zin;
  end;

  procedure keturi (var a, b, dbd, mbk : integer);
    { atstato skai‡ius, kai ne‘inomi visi keturi skai‡iai }
  begin
    a := 1; b := 1;
    dbd := 1; mbk := 1;
  end;

  procedure atstatyti (var a, b, dbd, mbk : integer);
    { atstato tr–kstamus skai‡ius }
    var truksta : integer; { kiek skai‡i— reikia atstatyti }
  begin
    { rasime kiek skai‡i— tr–ksta }
    truksta := ord(a = 0) + ord(b = 0) + ord(dbd = 0) + ord(mbk = 0);
    case truksta of
      0 : netruksta (a, b, dbd, mbk);
      1 : vienas (a, b, dbd, mbk);
      2 : du (a, b, dbd, mbk);
      3 : trys (a, b, dbd, mbk);
      4 : keturi (a, b, dbd, mbk);
    end;
  end;

  const P = 16; { pradini— duomen— rinkini— skai‡ius }
  var f : text;
      i, a, b, dbd, mbk : integer;
begin
  assign (f, 'dal.dat');
  reset (f);
  writeln ('     a     b    dbd  mbk         a     b    dbd  mbk');
  for i := 1 to P do
    begin
      readln (f, a, b, dbd, mbk);
      write (a : 6, b : 6, dbd : 6, mbk : 6);
      atstatyti (a, b, dbd, mbk);
      writeln (a : 10, b : 6, dbd : 6, mbk : 6);
    end;
  close (f);
end.
