Cod sursa(job #31527)

Utilizator alecmanAchim Ioan Alexandru alecman Data 16 martie 2007 10:50:24
Problema Factorial Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
/*
 *
 *
  info-arena 2.0 - Arhiva - Factorial
 *
 *
 */

#include<stdio.h>

#define INPUT "fact.in"
#define OUTPUT "fact.out"

FILE *fin=fopen(INPUT, "r"),*fout=fopen(OUTPUT, "w");

long p;

inline void citire(){fscanf(fin, "%ld", &p);}
void rezolvare();
long nrcinci(long x);

int main()
{
  citire();
  if(p!=0)
  rezolvare();
  else
    fprintf(fout, "%d\n", 1);
  fclose(fin);
  fclose(fout);
}

void rezolvare()
{
  long k=0,pas=1,cont=0,valoare=0,valad=5,valtot=0;
  while(k<p&&pas)
  {
    ++cont;
    k+=pas;
    valoare+=valad;
    if(cont==5)
    {
      ++k;
      pas*=5;
      if(valtot)
       k+=nrcinci(valoare)-1;
      valtot=0;
      ++pas;
      cont=1;
      valad*=5;
    }
    while(k>p&&pas)
    {
      if(cont==1)
      {
        --pas;
        pas/=5;
        --k;
        k-=pas;
        --pas;
        pas/=5;
        valad/=5;
        valoare-=valad;
        valad/=5;
        cont=0;
        valtot=1;
      }
      else
      {
        k-=pas;
        --pas;
        pas/=5;
        cont=1;
        valoare-=valad;
        valad/=5;
      }
    }
  }
  if(pas)
  fprintf(fout, "%ld\n", valoare);
  else
  fprintf(fout, "%ld\n", -1);
}

long nrcinci(long x)
{
  long r=0;
  while(x%5==0)
  {
    ++r;
    x/=5;
  }
  return r;
}