Cod sursa(job #188150)

Utilizator cotofanaCotofana Cristian cotofana Data 6 mai 2008 21:38:56
Problema Factorial Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <stdio.h>

long n, nr;

void cit()
{
	FILE *f=fopen("fact.in", "r");
	fscanf(f, "%ld", &n);
	fclose(f);
}
long put5(long nr)
{
	long i=0;
	while (nr%5==0)
	{
		nr/=5;
		i++;
	}
	return i;
}

void fact()
{
        long nr_cfr[13]={0, 6, 31, 156, 781, 3906, 19531, 97656, 488281, 2441406, 12207031, 61035156, 305175781};
	long i, a, b, c;
	a=0;
        b=12;
        if (n==0)
        {
                nr=1;
                return ;
        }
        while (a<b)
        {
                c=(a+b)/2;
                if (c==a || c==b) break;
                if (n==nr_cfr[c])
                {
                        if (c==1) nr=25;
                        else if (c==2) nr=125;
                        else nr=nr_cfr[c-2]*100+25;
                        break;
                }
                else if (n<nr_cfr[c]) b=c-1;
                else a=c;
        }
        if (a==0) i=0;
        else if (a==1) i=25;
        else if (a==2) i=125;
        else i=nr_cfr[a-2]*100+25;
        nr=nr_cfr[a];
	while (nr<n)
	{
		i+=20;
                nr+=4;
                if (nr==n) break;
                else if (nr>n)
                {
                        i-=5*(nr-n);
                        nr=n;
                }
                else
                {
                        i+=5;
                        nr+=put5(i);
                }
	}
        if (nr==n) nr=i;
	else if (nr>n) nr=-1;
	if (n==0) nr=1;
}

void tip()
{
	FILE *f=fopen("fact.out", "w");
	fprintf(f, "%ld\n", nr);
	fclose(f);
}

int main()
{
	cit();
	fact();
	tip();
	return 0;
}