Cod sursa(job #2197820)

Utilizator cosminionutCosmin Ionut cosminionut Data 22 aprilie 2018 22:10:31
Problema Factorial Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;

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

int P;
int N;

#define N_MAX_APROX 381000000


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";
	}
}

int puteri5(int n) {
	int x, i, p;
	x = n / 5;
	for (i = 2, p = 25; p <= n; i++, p*=5)
		x += n / p * (i - 1);
	return x;
}

unsigned long long st = 5, dr = N_MAX_APROX, m, m_val;


int main() {
	f >> P;
	if (P == 0)
		return 1;

	while (true) {
		m = (st + dr) / 2;
		m_val = puteri5(m);
		if (st == dr || m_val == P) {
			g << m / 5 * 5;
			break;
		}
		else if (m_val > P) {
			dr = m - 1;
		}
		else if (m_val < P) {
			st = m + 1;
		}
	}

	return 0;
}