Cod sursa(job #82318)

Utilizator 100puncteIonut Popa 100puncte Data 6 septembrie 2007 16:27:29
Problema Factorial Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
/*
100p
*/

#include<fstream.h>

long long nr;
long long n;


void citire()
{
  ifstream in("fact.in");
  in>>n;
  in.close();
}



long long nrz( long c )
{
     long long p = 0;
     while( c )
     {
            p += c/5;
            c /= 5;
     }
     return p;
}

long long cautare()
{
  long long p, u, a, ok=1, exa, m;
  p=1; u=3000000000;
  a=(p+u)/2;
  m=nrz(a);
  while (ok)
    {
	exa=a;
      if (m==n) ok=0;
	 else if (m>n)  { u=a; a=(p+u)/2;}
	       else  { p=a; a=(p+u)/2; }
      m=nrz(a);
      if (exa==a) break;
    }
  if (ok==0) return a;
   else return -1;
}

void reduc()
{
  long long m;
  m=nrz(nr);
  while (m==n)
    {
      nr--;
      m=nrz(nr);
    }
  nr++;
}

int main()
{
  citire();
  ofstream out("fact.out");
  nr=cautare();
  if (nr!=-1)
  reduc();
if (n==0) nr=1;
  out<<nr;
  out.close();
  return 0;
}

/*
#include <cstdio>
#define ui unsigned int

inline ui nrzero(ui i)
{
	ui t=0;
	while(i) t+=i/=5;
	return t;
}

int main()
{
	ui cnt, n, i, p, q;
	
	freopen("fact.in","r",stdin);
	freopen("fact.out","w",stdout);
	scanf("%d", &n);
	
	for(i=cnt=1<<30;cnt;cnt>>=1)
		i-=i-cnt>=1 && nrzero(i-cnt)>=n ?cnt:0; //	if(i-cnt>=1 && nrzero(i-cnt)>=n) i-=cnt;
	i=nrzero(i)==n?i:-1;
	printf("%d\n", i);
	return 0;
}

	
*/