Cod sursa(job #239944)

Utilizator airineivAirinei Vasile airineiv Data 6 ianuarie 2009 14:22:38
Problema Factorial Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include "math.h"
#include "stdio.h"

unsigned long long factZeros(unsigned long long n)
{
		unsigned long long nr = 0;
		int kMax = (int)(log((long double)n)/log(5.0));
		for(int k=1; k<=kMax; k++)
			{
				unsigned long long val = n/(unsigned int)(pow(5.0, k));
				nr += val;
			}
		return nr;
}

int main(void)
{
	unsigned long long b = (unsigned long long)pow(2.0, 31.0) - 1;
	unsigned long long a = 0;
	unsigned int p = 0;
	int n=-1;
	FILE *fin, *fout;

	if((fin = fopen("fact.in", "r")) == NULL)
		return -1;
	if((fout = fopen("fact.out", "w")) == NULL)
		return -1;
	
	fscanf(fin, "%d", &p);
	
	while(1)
	{
		unsigned long long c = (a + b)/2;
		unsigned long long z = factZeros(c);
		if(z == p)
			{
				n = c--;
				while(c != 0)
				{
					z = factZeros(c);
					if(z != p)
						break;
					n = c--;
				}
				break;
			}
		else if(z < p && (b - a > 2))
			{
				a = c;
			}
		else if(z > p &&  (b - a > 2))
			b = c;
		else if(b - a <= 2)
			{
				unsigned long long z1 = factZeros(a);
				unsigned long long z2 = factZeros(b);
				unsigned long long z3 = factZeros(c);
				if(z1 == p)
					{
						n = a;
						break;
					}
				else if(z2 == p)
					{
						n = b;
						break;
					}
				else if(z3 == p)
					{
						n = c;
						break;
					}
				else break;
			}
		else break;	
	}	
	fprintf(fout, "%d", n);
	fclose(fin);
	fclose(fout);	
	return 0;
}