Cod sursa(job #1969814)

Utilizator _Victor_Victor Ciobanu _Victor_ Data 18 aprilie 2017 17:39:55
Problema Algoritmul lui Euclid extins Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 2.47 kb
//http://www.infoarena.ro/algoritmul-lui-euclid
Program EuclidExt;
type maxt = -1000000000 .. 1000000000;
maxc = -2000000000 .. 2000000000;
var d,a,b,x,y,t,i,c : longint;
f,g : text;
{ Cmmdc : cel mai mare divizor comun.
O prezentare a variantei extinse a algoritmului lui Euclid, care rezolva ecuatie de forma A * X + B * Y = D, unde D este cel mai
mare divizor comun al lui A si B. De asemenea este prezentata o aplicatie "interesanta": impartirea modulara.
Observam ca la inceput la algoritmul cel simplu noi trebuiam sa facem impartirea modulara la doua cifre: a si b.
Si prin asta se ajungea la forma a*1 + b*0 = d,  spre exemplu daca a = 23 si b = 2 atunci dupa configuratia
23*1 + 2*1 = 25
Imparteam modular totul la cel mai mic termen pana nu ajungeam la b = 0
2*1 + 1*1 = 3
1*1 + 0*1 = 1
si cmmdc = 1 = a (din final)
asta ar fi Euclidul simplu.
Dar la cel extins vom aplica aceeasi metoda doar ca vom incepe de la 'capatul recurentei' adica de la coada prin ecuatia
a*x + b*y = d ;
Notand x=1 si y=0 
a*1 + b*0 = a (care e cmmdc pentru (a*1 si b*0 !!!)) 
Notand x0 si y0 ca factorii initiali scrim ecuatiile :
a * x + b * y = d  
b*x0 + (a%b)*y0 = d (pentru ca d nu se schimba niciodata)
}
//Am creat o procedura ca si in cazul algoritmului lui Euclid precedent dar cu niste schimbari totusi ...
procedure euclid (a,b:longint;var d,x,y : longint);
var x0,y0 : longint;
begin
//Daca b este nul atunci schimbam x in 1 si y in 0 deoarece nu are importanta valoarea y pentru ca b = 0 
 if b = 0 then begin
  x:= 1;
  y:= 0;
  //Am ajuns la un cmmdc deci egalam: d = a
  d := A;
 end else begin
  //Procedura Euclid continua pana cand nu se ajunge la un divizor comun (b = 0)
  euclid(b, a mod b,d,x0,y0);
  //Conform formulelor schimbam x si y-ul sa primim coeficientii initiali 
  x:= y0;
  y:= x0 - (a div B) * y0;
 end;
end;
begin
assign(f,'euclid3.in');
assign(g,'euclid3.out');
reset(f);
rewrite(g);
readln(f,T);
{Blocul de citire si de afisare a rezutatelor :
//http://www.infoarena.ro/problema/euclid3
Astfel se poate determina perechea (x y) care satisface relatia a * x + b * y = d, unde d este cmmmdc(a, b). 
In cazul in care c nu se divide cu d ecuatia nu poate fi rezolvata in multimea numerelor intregi, in caz contrar se inmulteste intreaga ecuatie cu c div d.} 
for i:=1 to T do begin
 read(f,a,b,c);
 euclid(a,b,d,x,y);
 if c mod d = 0 then 
  writeln(g,x*(c div d),' ',y*(c div D))
   else 
  writeln(g,'0 0');
end;
close(f);
close(g);
end.