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, s, mbk : integer);
    { jei ‘inomi visi skai‡iai, patikrina, ar jie teisingi }
  begin
    if (a + b <> s) or (mbkf (a, b) <> mbk)
       then begin  { skai‡i— atstatyti nepavyko }
              a := 0; b := 0;
              s := 0; mbk := 0;
            end;
  end;

  procedure vienas (var a, b, s, mbk : integer);
    { atstato skai‡ius, kai ne‘inomas vienas skai‡ius }
  begin
    { atstatysime tr–kstam… skai‡i— }
    if a = 0
       then a := s - b
       else if b = 0
               then b := s - a
               else if s = 0
                       then s := a + b
                       else mbk := mbkf (a, b);
    { patikrinsime, ar pavyko atstatyti }
    netruksta (a, b, s, mbk);
  end;

  procedure du (var a, b, s, mbk : integer);
    { atstato skai‡ius, kai ne‘inomi du skai‡iai }
    var d, tarp : integer;
        rasta : boolean;
  begin
    if (a = 0) and (b = 0)
       then begin { perrinksime mbk daliklius }
              d := 0;
              rasta := false;
              while (d <= mbk div 2) and not rasta do
                begin
                  d := d + 1;
                  if (mbk mod d = 0) and (s > d)
                     then rasta := mbkf(s - d, d) = mbk
                 end;
              if rasta
                 then begin
                        a := d;
                        b := s - d;
                      end;
            end
       else if (s = 0) and (mbk = 0)
               then begin
                      s := a + b;
                      mbk := mbkf (a, b);
                     end
       else if mbk = 0
               then begin
                      if a = 0
                         then a := s - b
                         else b := s - a;
                       mbk := mbkf (a, b);
                    end
       else begin { ne‘inomas a arba b ir s }
              tarp := mbk div (a + b);
              if a = 0
                 then a := tarp * dbdf (tarp, b)
                 else b := tarp * dbdf (a, tarp);
              s := a + b;
            end;
    { patikrinsime, ar pavyko atstatyti }
    netruksta (a, b, s, mbk);
  end;

  procedure trys (var a, b, s, mbk : integer);
    { atstato skai‡ius, kai ne‘inomi trys skai‡iai }
  begin
    { atstatytsime skai‡i— a }
    if a = 0
       then a := 1;
    { atstatysime skai‡i— b }
    if s <> 0
       then b := s - a
       else if mbk <> 0
               then b := mbk
               else b := 1;
    { ir likusius du skai‡ius }
    if s = 0
       then s := a + b;
    if mbk = 0
       then mbk := mbkf(a, b);
    netruksta (a, b, s, mbk);
  end;

  procedure keturi (var a, b, s, mbk : integer);
    { atstato skai‡ius, kai ne‘inomi visi keturi skai‡iai }
  begin
    a := 1; b := 1;
    s := 2; mbk := 1;
  end;

  procedure atstatyti (var a, b, s, mbk : integer);
    { atstato tr–kstamus skai‡ius }
    var truksta,  { kiek skai‡i— reikia atstatyti }
        a1, b1, s1, mbk1 : integer;
  begin
    { rasime kiek skai‡i— tr–ksta }
    truksta := ord(a = 0) + ord(b = 0) + ord(s = 0) + ord(mbk = 0);
    { ižsaugosime pradinius duomenis }
    a1 := a; b1 := b; s1 := s; mbk1 := mbk;
    if (s <> 0) and ((a >= s) or (b >= s))
       then begin { d‚muo negali b–ti ma‘esnis u‘ sum… }
              a := 0; b := 0;
              s := 0; mbk := 0;
            end
        else case truksta of
               0 : netruksta (a, b, s, mbk);
               1 : vienas (a, b, s, mbk);
               2 : du (a, b, s, mbk);
               3 : trys (a, b, s, mbk);
               4 : keturi (a, b, s, mbk);
             end;
      if (a = 0) and (truksta <> 0)
         { jei nepavyko atstatyti, gr…‘iname ankstesnes reikžmes }
         then begin
                a := a1; b := b1;
                s := s1; mbk := mbk1;
               end;
  end;

  var f : text;
      i, a, b, s, mbk : integer;
begin
  writeln ('­veskite keturis skai‡ius: ');
  readln (a, b, s, mbk);
  atstatyti (a, b, s, mbk);
  writeln (a, ' ', b, ' ', s, ' ', mbk);
end.
