Cod sursa(job #2197870)

Utilizator cosminionutCosmin Ionut cosminionut Data 22 aprilie 2018 23:33:15
Problema Factorial Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;

ifstream f("fact.in");
ofstream g("fact.out");

unsigned long long P, N;

void test(int p) {
	// naiv
	unsigned long long prod = 1;
	unsigned long long i = 1;
	unsigned long long P = (unsigned long long)pow(10, p);
	while (i < 50) {
		cout << prod << "\n";
		if (prod % P == 0) {
			cout << i << "\n";
			break;
		}
		i += 1;
		prod *= i;
	}
}

void a(int p) {
	// testeaza numere din 5 in 5
	if (p == 0)
		g << 1 << " \n";
	else {
		int count = 0;
		int x, aux;
		for (x = 0; count < p;) {
			x += 5;
			aux = x;
			while (aux % 5 == 0) { aux /= 5; count++; }
		}
		g << x << "\n";
	}
}

unsigned long long puteri5(unsigned long long n) {
	unsigned long long x = 0, p;
	for (p = 5; p <= n; p*=5)
		x += n / p;
	return x;
}

unsigned long long st = 5, dr = 1000000020, m, m_val, aux1, aux2;


int main() {
	f >> P;
	if (P == 0) {
		g << 1;
		return 0;
	}
	while (true) {
		m = (st + dr) >> 1;
		m_val = puteri5(m);
		if (m == st && m_val != P) {
			g << -1;
			break;
		}
		else if (m_val == P) {
			aux1 = m;
			do {
				aux1--;
				aux2 = puteri5(aux1);
			} while (aux2 == P);
			g << aux1 + 1;
			break;
		}
		else if (m_val > P) {
			dr = m - 1;
		}
		else if (m_val < P) {
			st = m + 1;
		}
	}
	return 0;
}