Cod sursa(job #1223411)

Utilizator XiewRiklXiewRikl XiewRikl Data 28 august 2014 08:02:08
Problema Factorial Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
/*
 * factorial.cpp
 * http://www.infoarena.ro/problema/fact
 *  Created on: 25 Aug 2014
 *      Author: XiewRikl
 */
#include<fstream>
#include<iostream>
#include<map>

void success(unsigned long long p){
	//std::cout<<p<<std::endl;
	std::ofstream oFile("fact.out");
	oFile<<p<<std::endl;
	oFile.close();
}
void fail(void){
	//std::cout<<-1<<std::endl;
	std::ofstream oFile("fact.out");
	oFile<<-1<<std::endl;
	oFile.close();
}

unsigned long long int getFives(unsigned long long int f){
	unsigned long long int p=0;
	//std::cout<<"getFives("<<f;
	while(f)
		p+= f/= 5;
	//std::cout<<")="<<p<<std::endl;
	return(p);
}

void fact(unsigned long int P){
	if(P==0){success(1);return;}
	const unsigned long MAX = 400000016;
	unsigned long lfs=0,ris=MAX,cen,t;
	//ris /= 2;
	//std::cout<<"For P="<<P<<": ";
	while(lfs<ris){
		cen = (lfs+ris)/2;
		t=getFives(cen);
		if(t<P) {
			if(lfs==cen) break;
			lfs=cen;
		}
		else if(t>P) {
			if(ris==cen) break;
			ris=cen;
		}
		else {
			success(cen-cen%5);
			return;
		}
	}
	fail();
}



int main(void){
	std::ifstream iFile("fact.in");
	unsigned long long int P;
	iFile>>P;
	iFile.close();
	fact(P);
}