Cod sursa(job #109732)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 25 noiembrie 2007 12:34:31
Problema Ecuatie Scor 100
Compilator fpc Status done
Runda preONI 2008, Runda 1, Clasele 5-8 Marime 2 kb
var d1,d2,v:array[1..1000000]of longint;
    n,i,j,k,a1,a2,a3,l,k1,k2:longint;
    f:text;
begin
   assign(f,'ecuatie.in');
   reset(f);
   read(f,a1,a2,a3,k);
   close(f);
   l:=0;
   for i:=1 to trunc(sqrt(abs(a1)))do
   if a1 mod i=0 then begin l:=l+1;
                            v[l]:=i;
                      end;
   l:=l*2;
   if trunc(sqrt(abs(a1)))=sqrt(abs(a1))then l:=l-1;
   for i:=1 to l div 2 do
   v[l-i+1]:=abs(a1) div v[i];
   for i:=1 to l do
   d1[i+l]:=v[i];
   for i:=l+1 to l*2 do
   d1[l*2-i+1]:=d1[i]*(-1);
   k1:=l*2;
   l:=0;
   for i:=1 to trunc(sqrt(abs(a3)))do
   if a3 mod i=0 then begin l:=l+1;
                            v[l]:=i;
                      end;
   l:=l*2;
   if trunc(sqrt(abs(a3)))=sqrt(abs(a3))then l:=l-1;
   for i:=1 to l div 2 do
   v[l-i+1]:=abs(a3) div v[i];
   for i:=1 to l do
   d2[i+l]:=v[i];
   for i:=l+1 to l*2 do
   d2[l*2-i+1]:=d2[i]*(-1);
   k2:=l*2;
   i:=0;
   l:=0;
   j:=0;
   repeat
   i:=i+1;
   j:=0;
   repeat
   j:=j+1;
   if(d1[i]*(a3 div d2[j]))+(d2[j]*(a1 div d1[i]))=a2 then l:=l+1;
   until(l=k)or(j=k2);
   until(l=k)or(i=k1);
   assign(f,'ecuatie.out');
   rewrite(f);
   if l=k then begin write(f,'(');
                     if d1[i]<0 then write(f,'-');
                     if abs(d1[i])>1 then write(f,abs(d1[i]));
                     write(f,'x');
                     if d2[j]<0 then write(f,'-')
                                else write(f,'+');
                     write(f,abs(d2[j]));
                     write(f,')(');
                     if a1 div d1[i]<0 then write(f,'-');
                     if abs(a1 div d1[i])>1 then write(f,abs(a1 div d1[i]));
                     write(f,'x');
                     if a3 div d2[j]<0 then write(f,'-')
                                       else write(f,'+');
                     write(f,abs(a3 div d2[j]));
                     write(f,')');
                     writeln(f);
               end
          else writeln(f,'-1');
   close(f);
end.