Cod sursa(job #513371)

Utilizator mariusmagureanmagurean marius mariusmagurean Data 15 decembrie 2010 19:22:05
Problema Factorial Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
//se da un numar intreg 0<=p<=100 milioane
//se cere cel mai mic numar intreg ptr care factorialul are fix p zerouri in coada

#include<fstream>
using namespace std;
int p;

//functie care intoarce fm lui 5 din desc in factori primi ai unui nr
int putere5(int n)
{
	int contor=0;
	while(n%5==0)
	{
		contor++;
		n/=5;
	}
	return contor;
}

//de cate ori apare 5 in desc in factori primi ai lui n!
int putere5infact(int n)
{
	//daca nu se divide la 5 patrat(25) atunci 5 apare o sg data, altfel se apeleaza functia putere5
	int i,contor5=0;
	//evident i merge din 5 in 5(doar astea se pot divide la 5)
	for(i=5;i<=n;i+=5)
		if(i%25!=0)
			contor5+=1;
		else
			contor5+=putere5(i);
	return contor5;
}

int main()
{
	ifstream f("fact.in");
	ofstream g("fact.out");
	
	f>>p;
	if(p==0)
	{
		g<<1;
		return 0;
	}
	//cautare binara
	// a=0 si b=10 milioane. daca nrzerodinfact((a+b)/2)<p tre sa caut in dreapta, altfel caut in stanga
	//repet pana nrdezerodinfact=p sau a il depaseste pe b(in acest caz afisez -1)
	int a=0,b=10000000,c,rez,gasit=0;
	while(a<b && gasit==0)
	{
		c=(a+b)/2;
		rez=putere5infact(c);
		if(rez<p)
			a=c+1;
		else
			if(rez>p)
				b=c-1;
			else
			{
				//nu stim daca nr gasit este cel mai mic, dar el oricum face parte dintr o multime cu maxim 5 elemente  
				//nr corect este si multiplu de 5
				//impart nr la 5 si scad restul din el.Ex 13%5=3 deci nr minim va fi 13-3=10
				c=c-c%5;
				g<<c;
				gasit=1;
			}
	}
	if(gasit==0)
		g<<-1;
	return  0;
}