Cod sursa(job #5712)

Utilizator m123pop manu m123 Data 14 ianuarie 2007 01:04:41
Problema Factorial Scor 25
Compilator fpc Status done
Runda Arhiva de probleme Marime 3.71 kb
program factorial {arhiva arena};
var f,g:text;
    p,n,i,nr,a,b,na,nb:longint;
procedure gaseste (var a,b:longint;nr:longint);
var na,nb:longint;
begin

while b-a>100 do
 begin
  na:=a+a div 5+a div 25+a div 125+a div 625+a div 3125+a div 15625
         +a div 78125+a div 390625;
          nb:=b+b div 5+b div 25+b div 125+b div 625+b div 3125+b div 15625
         +b div 78125+b div 390625;
 if nr<na+(nb-na) div 2 then b:=a+(b-a) div 2
                   else a:=a+(b-a) div 2;
 end;
end;
begin
assign(f,'fact.in');reset(f);
assign(g,'fact.out');rewrite(g);
readln(f,p);
case p of
0:writeln(g,1);
1:writeln(g,5);
2:writeln(g,10);
3:writeln(g,15);
4:writeln(g,20);
5:writeln(g,-1);
6:writeln(g,25);
7..30:begin i:=6;while i+i div 5 < p do inc(i);
       if i+i div 5 =p then write(g,i*5)
                       else write(g,-1);
       end;
31:write(g,125);
32..155:begin i:=26;
         while i+i div 5+i div 25 < p do
                             inc(i);
       if i+i div 5+i div 25 =p then write(g,i*5)
                       else write(g,-1);
       end;
156:write(g,625);
157..780:begin i:=126;
         while i+i div 5+i div 25+i div 125 < p do
                             inc(i);
       if i+i div 5+i div 25+ i div 125 =p then write(g,i*5)
                       else write(g,-1);
       end;
781:write(g,3125);
782..3905:begin i:=626;
         while i+i div 5+i div 25+i div 125+i div 625 < p do
                             inc(i);
       if i+i div 5+i div 25+ i div 125+i div 625 =p then write(g,i*5)
                       else write(g,-1);
       end;
3906:write(g,15625);
3907..19530:begin i:=3126;
         while i+i div 5+i div 25+i div 125+i div 625+i div 3125 < p do
                             inc(i);
       if i+i div 5+i div 25+ i div 125+i div 625+i div 3125 =p then write(g,i*5)
                       else write(g,-1);
       end;
19531:write(g,78125);

end;
if ( p>=19532)and ( p<=97655) then begin i:=15626;
         while i+i div 5+i div 25+i div 125+i div 625+i div 3125+i div 15625 < p do
                             inc(i);
       if i+i div 5+i div 25+ i div 125+i div 625+i div 3125+i div 15625 =p then write(g,i*5)
                       else write(g,-1);
       end;
if p=97656 then write(g,390625);
if ( p>=97657)and ( p<=488280) then begin i:=78126;
         while i+i div 5+i div 25+i div 125+i div 625+i div 3125+i div 15625
         +i div 78125 < p do
                             inc(i);
       if i+i div 5+i div 25+ i div 125+i div 625+i div 3125+i div 15625
       +i div 78125 =p then write(g,i*5)
                       else write(g,-1);
       end;
if p=488281 then write(g,1953125);
if ( p>=488282)and ( p<=2441405) then begin i:=390626;
        nr:=i+i div 5+i div 25+i div 125+i div 625+i div 3125+i div 15625
         +i div 78125+i div 390625;
         a:=390626;b:=1953125;

         gaseste(a,b,p);
         i:=a;
         while i+i div 5+i div 25+i div 125+i div 625+i div 3125+i div 15625
         +i div 78125+i div 390625 < p do
                             inc(i);
       if i+i div 5+i div 25+ i div 125+i div 625+i div 3125+i div 15625
       +i div 78125+ i div 390625 =p then write(g,i*5)
                       else write(g,-1);
       end;
if p=2441406 then write(g,9765625);
if ( p>=2441406)and ( p<=12207030) then begin i:=1953126;
         while i+i div 5+i div 25+i div 125+i div 625+i div 3125+i div 15625
         +i div 78125+i div 390625+ i div 1953125 < p do
                             inc(i);
       if i+i div 5+i div 25+ i div 125+i div 625+i div 3125+i div 15625
       +i div 78125+ i div 390625+i div 1953125 =p then write(g,i*5)
                       else write(g,-1);
       end;
close(f);close(g);
end.