Cod sursa(job #30340)

Utilizator razvi9Jurca Razvan razvi9 Data 13 martie 2007 19:44:25
Problema Factorial Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<stdio.h>
long nr,p;
long nz(long p)
{long nr=0;
 while(p%5==0) {nr++;  p=p/5;}
 return nr;}
long nrzero(long n,long nri,long p)
{long nr=nri;
 for(long i=p-p%5+5;i<=n;i=i+5)
  nr=nr+1+nz(i/5);
 return nr;}
long div(long inc,long sf,long nr)
{long m=(inc+sf)/2,nz;
 nz=nrzero(m,nr,inc);
 if(nz==p) return m;
 if(nz<p) return div(m,sf,nz);
 return div(inc,m,nr);
}
int main()
{freopen("fact.in","r",stdin);
 scanf("%ld",&p);
 fclose(stdin);
 if(p==0) nr=1;
 if(p<1000) nr=div(1,4005,0);
 if(p==1000) nr=4005;
 if(p>1000&&p<10000) nr=div(4005,40010,1000);
 if(p==10000) nr=40010;
 if(p>10000&&p<100000) nr=div(40010,400005,10000);
 if(p==100000) nr=400005;
 if(p>100000&&p<1000000)nr=div(400005,4000005,100000);
 if(p==1000000) nr=4000005;
 if(p>1000000&&p<5000000) nr=div(4000005,20000005,1000000);
 if(p==5000000) nr=20000005;
 if(p>5000000&&p<10000000) nr=div(20000005,40000010,5000000);
 if(p==10000000) nr=40000010;
 if(p>10000000&&p<20000000) nr=div(40000010,80000015,10000000);
 if(p==20000000) nr=80000015;
 if(p>20000000&&p<30000000) nr=div(80000015,120000010,20000000);
 if(p==30000000) nr=120000010;
 if(p>30000000) nr=div(40000010,p*5,10000000);
 while(nr!=1&&nr%5) nr--;
 freopen("fact.out","w",stdout);
 printf("%ld",nr);
 fclose(stdout);
 return 0;}