Cod sursa(job #118508)

Utilizator m123pop manu m123 Data 26 decembrie 2007 14:14:48
Problema Ecuatie Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 13.25 kb
Program ecuatie;{pre ONI 2008 runda1}
label 1,2;
type
elem=record
      p1,q1,p2,q2:longint;
      end;
var f,g:text;
a,b,c,p1,p2,q1,q2,k,delta,i,n,d,ok,d1,m:longint;
x1,x2,y1,y2:real;
s:array[1..3] of elem;
o:array[1..10000] of longint;
x:elem;
begin
assign(f,'ecuatie.in');reset(f);
assign(g,'ecuatie.out');rewrite(g);

read(f,a,b,c,k);
n:=0;
delta:=b*b-4*a*c;
if delta <0 then begin writeln(g,-1); goto 1;end
            else if sqrt(delta)<>trunc(sqrt(delta))
                     then begin writeln(g,-1); goto 1;end;
x1:=(-b+sqrt(delta))/(2*a);
x2:=(-b-sqrt(delta))/(2*a);

{generam div negativi}
m:=0;
for d:=1 to trunc(sqrt(a)) do
  if a mod d=0 then begin
              m:=m+1;o[m]:=d;
              d1:=a div d;d1:=-d1;
              p1:=d1;p2:=a div d1;
              y1:=-x1*d1;y2:=-x2*p2;
               if( trunc(y1)=y1) and (trunc(y2)=y2) then
                 begin
                           q1:=trunc(y1);q2:=trunc(y2);
                            n:=n+1;
                            if n+1 =k then begin s[1].p1:=p1;s[1].q1:=q1;
                                                  s[1].p2:=p2;s[1].q2:=q2
                                          end
                                     else if n =k then  begin
                                           s[2].p1:=p1;s[2].q1:=q1;
                                           s[2].p2:=p2;s[2].q2:=q2;
                                          if s[1].p1 =s[2].p1 then
                                           if s[1].q1>s[2].q1 then begin
                                           x:=s[1];s[1]:=s[2];s[2]:=x; end;
                                                          end

                                       else
                                       if n=k+1 then  begin
                                           s[3].p1:=p1;s[3].q1:=q1;
                                           s[3].p2:=p2;s[3].q2:=q2;
                                          if s[2].p1 =s[3].p1 then
                                           if s[2].q1>s[3].q1 then begin
                                           x:=s[2];s[2]:=s[3];s[3]:=x; end;
                                          end
                             end;
                          p1:=d1;p2:=a div d1;
                       y1:=-x2*d1;y2:=-x1*p2;
                      if( trunc(y1)=y1) and (trunc(y2)=y2) then
                           begin
                           q1:=trunc(y1);q2:=trunc(y2);
                            n:=n+1;
                            if n+1 =k then begin s[1].p1:=p1;s[1].q1:=q1;
                                                  s[1].p2:=p2;s[1].q2:=q2
                                          end
                                     else if n =k then  begin
                                           s[2].p1:=p1;s[2].q1:=q1;
                                           s[2].p2:=p2;s[2].q2:=q2;
                                          if s[1].p1 =s[2].p1 then
                                           if s[1].q1>s[2].q1 then begin
                                           x:=s[1];s[1]:=s[2];s[2]:=x; end;
                                          end
                                     else
                                       if n=k+1 then  begin
                                           s[3].p1:=p1;s[3].q1:=q1;
                                           s[3].p2:=p2;s[3].q2:=q2;
                                          if s[2].p1 =s[3].p1 then
                                           if s[2].q1>s[3].q1 then begin
                                           x:=s[2];s[2]:=s[3];s[3]:=x; end;
                                          end
                                           else
                                       if n=k+1 then  begin
                                           s[3].p1:=p1;s[3].q1:=q1;
                                           s[3].p2:=p2;s[3].q2:=q2;
                                          if s[2].p1 =s[3].p1 then
                                           if s[2].q1>s[3].q1 then begin
                                           x:=s[2];s[2]:=s[3];s[3]:=x; end;
                                          end
                             end;

                     end;
if trunc(sqrt(a))=sqrt(a) then m:=m-1;
for i:=m downto  1 do
  begin
  d1:=-o[i];
  p1:=d1;p2:=a div d1;
                       y1:=-x1*d1;y2:=-x2*p2;
                      if( trunc(y1)=y1) and (trunc(y2)=y2) then
                           begin
                           q1:=trunc(y1);q2:=trunc(y2);
                            n:=n+1;
                            if n+1 =k then begin s[1].p1:=p1;s[1].q1:=q1;
                                                  s[1].p2:=p2;s[1].q2:=q2
                                          end
                                     else if n =k then  begin
                                           s[2].p1:=p1;s[2].q1:=q1;
                                           s[2].p2:=p2;s[2].q2:=q2
                                          end
                                           else
                                       if n=k+1 then  begin
                                           s[3].p1:=p1;s[3].q1:=q1;
                                           s[3].p2:=p2;s[3].q2:=q2;
                                          if s[2].p1 =s[3].p1 then
                                           if s[2].q1>s[3].q1 then begin
                                           x:=s[2];s[2]:=s[3];s[3]:=x; end;
                                          end
                             end;
                          p1:=d1;p2:=a div d1;
                       y1:=-x2*d1;y2:=-x1*p2;
                      if( trunc(y1)=y1) and (trunc(y2)=y2) then
                           begin
                           q1:=trunc(y1);q2:=trunc(y2);
                            n:=n+1;
                            if n =k-1 then begin s[1].p1:=p1;s[1].q1:=q1;
                                                  s[1].p2:=p2;s[1].q2:=q2
                                          end
                                     else if n =k then  begin
                                           s[2].p1:=p1;s[2].q1:=q1;
                                           s[2].p2:=p2;s[2].q2:=q2;
                                          if s[1].p1 =s[2].p1 then
                                           if s[1].q1>s[2].q1 then begin
                                           x:=s[1];s[1]:=s[2];s[2]:=x end
                                            end
                                            else
                                       if n=k+1 then  begin
                                           s[3].p1:=p1;s[3].q1:=q1;
                                           s[3].p2:=p2;s[3].q2:=q2;
                                          if s[2].p1 =s[3].p1 then
                                           if s[2].q1>s[3].q1 then begin
                                           x:=s[2];s[2]:=s[3];s[3]:=x; end;
                                          end

                                          end;
                             end;

for i:=1 to m do
  begin
  d1:=o[i];
  p1:=d1;p2:=a div d1;
                       y1:=-x1*d1;y2:=-x2*p2;
                      if( trunc(y1)=y1) and (trunc(y2)=y2) then
                           begin
                           q1:=trunc(y1);q2:=trunc(y2);
                            n:=n+1;
                            if n+1 =k then begin s[1].p1:=p1;s[1].q1:=q1;
                                                  s[1].p2:=p2;s[1].q2:=q2
                                          end
                                     else if n =k then  begin
                                           s[2].p1:=p1;s[2].q1:=q1;
                                           s[2].p2:=p2;s[2].q2:=q2
                                          end
                                           else
                                       if n=k+1 then  begin
                                           s[3].p1:=p1;s[3].q1:=q1;
                                           s[3].p2:=p2;s[3].q2:=q2;
                                          if s[2].p1 =s[3].p1 then
                                           if s[2].q1>s[3].q1 then begin
                                           x:=s[2];s[2]:=s[3];s[3]:=x; end;
                                          end
                             end;
                          p1:=d1;p2:=a div d1;
                       y1:=-x2*d1;y2:=-x1*p2;
                      if( trunc(y1)=y1) and (trunc(y2)=y2) then
                           begin
                           q1:=trunc(y1);q2:=trunc(y2);
                            n:=n+1;
                            if n =k-1 then begin s[1].p1:=p1;s[1].q1:=q1;
                                                  s[1].p2:=p2;s[1].q2:=q2
                                          end
                                     else if n =k then  begin
                                           s[2].p1:=p1;s[2].q1:=q1;
                                           s[2].p2:=p2;s[2].q2:=q2;
                                          if s[1].p1 =s[2].p1 then
                                           if s[1].q1>s[2].q1 then begin
                                           x:=s[1];s[1]:=s[2];s[2]:=x end
                                            end
                                            else
                                       if n=k+1 then  begin
                                           s[3].p1:=p1;s[3].q1:=q1;
                                           s[3].p2:=p2;s[3].q2:=q2;
                                          if s[2].p1 =s[3].p1 then
                                           if s[2].q1>s[3].q1 then begin
                                           x:=s[2];s[2]:=s[3];s[3]:=x; end;
                                          end

                                          end;
                             end;

if trunc(sqrt(a))=sqrt(a) then m:=m+1;
for i:=m downto 1 do
 begin
  d1:=a div o[i];
  p1:=d1;p2:=a div d1;
                       y1:=-x1*d1;y2:=-x2*p2;
                      if( trunc(y1)=y1) and (trunc(y2)=y2) then
                           begin
                           q1:=trunc(y1);q2:=trunc(y2);
                            n:=n+1;
                            if n+1 =k then begin s[1].p1:=p1;s[1].q1:=q1;
                                                  s[1].p2:=p2;s[1].q2:=q2
                                          end
                                     else if n =k then  begin
                                           s[2].p1:=p1;s[2].q1:=q1;
                                           s[2].p2:=p2;s[2].q2:=q2
                                          end
                                           else
                                       if n=k+1 then  begin
                                           s[3].p1:=p1;s[3].q1:=q1;
                                           s[3].p2:=p2;s[3].q2:=q2;
                                          if s[2].p1 =s[3].p1 then
                                           if s[2].q1>s[3].q1 then begin
                                           x:=s[2];s[2]:=s[3];s[3]:=x; end;
                                          end
                             end;
                          p1:=d1;p2:=a div d1;
                       y1:=-x2*d1;y2:=-x1*p2;
                      if( trunc(y1)=y1) and (trunc(y2)=y2) then
                           begin
                           q1:=trunc(y1);q2:=trunc(y2);
                            n:=n+1;
                            if n =k-1 then begin s[1].p1:=p1;s[1].q1:=q1;
                                                  s[1].p2:=p2;s[1].q2:=q2
                                          end
                                     else if n =k then  begin
                                           s[2].p1:=p1;s[2].q1:=q1;
                                           s[2].p2:=p2;s[2].q2:=q2;
                                          if s[1].p1 =s[2].p1 then
                                           if s[1].q1>s[2].q1 then begin
                                           x:=s[1];s[1]:=s[2];s[2]:=x end
                                            end
                                            else
                                       if n=k+1 then  begin
                                           s[3].p1:=p1;s[3].q1:=q1;
                                           s[3].p2:=p2;s[3].q2:=q2;
                                          if s[2].p1 =s[3].p1 then
                                           if s[2].q1>s[3].q1 then begin
                                           x:=s[2];s[2]:=s[3];s[3]:=x; end;
                                          end

                                          end;
                             end;

2:if n<k then writeln(g,-1)
       else      begin
                 write(g,'(');
                 if (s[2].p1 <>1) and (s[2].p1<>-1) then write(g,s[2].p1);
                 if s[2].p1=-1 then write(g,'-');
                 write(g,'x');
                  if s[2].q1>0 then write(g,'+');
                  write(g,s[2].q1,') (');
                  if (s[2].p2 <>1) and (s[2].p2<>-1) then write(g,s[2].p2);
                 if s[2].p2=-1 then write(g,'-');
                 write(g,'x');
                if s[2].q2>0 then write(g,'+');
                write(g, s[2].q2,')');
                 end;  ;
1:close(f); close(g);

end.