Cod sursa(job #264352)

Utilizator madflameAdrian Toncean madflame Data 21 februarie 2009 22:26:09
Problema Factorial Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.61 kb
var i, n, c, p, np, zg, o: longint; k: array[0..13] of LongInt; g: text;

function f(z: LongInt): LongInt;
var i, ret: LongInt;
begin
 ret:=0;
 for i:=1 to 13 do ret:=ret+(z div k[i]);
 f:=ret;
end;

begin
 Assign(g,'fact.in'); Reset(g); Read(g,n); Close(g);
{ n:=45001;} {write('Numar de zerouri cerute: ',n,#10#13);}

 k[0]:=1;
 for i:=1 to 13 do
  begin
   k[i]:=k[i-1]*5;
  end;
 p:=n-(n div 5);

 c:=p;
 i:=f(c*5);
 {write('N propus dupa o aproximare: ',i,' pentru ',c,' zerouri',#10#13);}
 while i<n do
  begin
   Inc(i);
   Inc(c);
   if i mod 5 = 0 then
    begin
     Inc(i);
     if i mod 25 = 0 then Inc(i);
     if i mod 125 = 0 then Inc(i);
     if i mod 625 = 0 then Inc(i);
     if i mod 3125 = 0 then Inc(i);
     if i mod 15625 = 0 then Inc(i);
     if i mod 78125 = 0 then Inc(i);
     if i mod 390625 = 0 then Inc(i);
     if i mod 1953125 = 0 then Inc(i);
     if i mod 9765625 = 0 then Inc(i);
     if i mod 48828125 = 0 then Inc(i);
     if i mod 244140625 = 0 then Inc(i);
     if i mod 1220703125 = 0 then Inc(i);
    end;
  end;
 {write('numarul ',c*5,' are ',f(c*5),' zerouri',#10#13,'-----------',#10#13);}
 np:=c*5;
 zg:=f(np);
 o:=np;
 if zg < n then
  begin
   while f(np) < n do np:=np+5;
   if f(np) > n then o:=-1 {write('nu exista',#10#13)}
   else o:=np;
  end
 else
  if zg > n then
   begin
    While f(np) > n do np:=np-5;
    If f(np) < n then o:=-1
    else o:=np; { write('nu exista',#10#13); }
   end;

 if o = 0 then o = 1;
 Assign(g,'fact.out'); ReWrite(g); write(g,o); Close(g);
{ write('numarul ',np,' are ',f(np),' zerouri');}
end.