Pagini recente » Cod sursa (job #804466) | Cod sursa (job #3254941) | Cod sursa (job #2854557) | Cod sursa (job #1968433) | Cod sursa (job #1969814)
//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.