Cod sursa(job #527319)

Utilizator mariusbuzgariuBuzgariu Marius mariusbuzgariu Data 31 ianuarie 2011 10:28:50
Problema Factorial Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.09 kb
PROGRAM FACTORIAL;        {~~~METODA EFICIENTA~~~}
(*
Sa se gaseasca cel mai mic numar natural nenul N (daca exista) astfel
incat N! are exact P cifre de zero la sfarsit.
*)
{------------------------------------------------}
FUNCTION NR_FACT_5(K:LONGINT):BYTE;
{Returneaza numarul factorilor de 5 din descompunerea numarului K.}
VAR NR:BYTE;
BEGIN
NR:=0;
WHILE (K MOD 5 = 0) DO BEGIN
                       NR:=NR+1;
                       K:=K DIV 5;
                       END;
NR_FACT_5:=NR;
END;
{------------------------------------------------}
VAR N,P,NR0,I:LONGINT;
    P5:ARRAY[1..12] OF LONGINT;
    F,G:TEXT;
BEGIN
ASSIGN(F,'fact.in'); RESET(F);
ASSIGN(G,'fact.out'); REWRITE(G);
READ(F,P);

P5[1]:=5;
FOR I:=2 TO 12 DO P5[I]:=P5[I-1]*5;    {P5[i]= 5^i,  i=1..12.}

NR0:=0;   {NR0= nr. cifrelor de zero de la finalul lui N factorial!}
IF (P=0) THEN N:=1
         ELSE BEGIN
              {#1. Se poate demonstra ca N>4*P, si ca N este multiplu de 5.}
              N:= (4*P) + 5 - ((4*P) MOD 5);

              {#2. Se poate arata ca, daca exista N, atunci are loc relatia:
                     P= [N/5] + [N/(5^2)] + [N/(5^3)] + ... + [N/(5^12)],
                   unde [x] este "partea intreaga" a lui x.
                     Folosind inegalitatea partii intregi: x-1 < [x] <= x,
                   si suma unor termeni in progresie geometrica,
                   se poate demonstra inegalitatea de la pasul #1.}
              FOR I:=1 TO 12 DO
                  NR0:= NR0 + (N DIV P5[I]);
              END;

WHILE (NR0<P) DO BEGIN
                 N:=N+5;
                 NR0:= NR0 + NR_FACT_5(N);
                 {OBS.: Cifrele de zero de la sfarsitul lui N! provin din
                 perechi de factori de 2 si 5. Cum factorii de 2 sunt mai
                 multi decat factorii de 5, este suficient sa numaram factorii
                 de 5 ce apar in descompunerea in factori primi pentru
                 fiecare factor din calculul lui N!=1*2*3*...*N.}
                 END;

IF (NR0=P) THEN WRITE(G,N)
           ELSE WRITE(G,-1);
CLOSE(F); CLOSE(G);
END.