Cod sursa(job #2439668)

Utilizator calinuxIorgulescu Calin calinux Data 16 iulie 2019 17:03:04
Problema Factorial Scor 20
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>

#define min(a, b) ((a) > (b) ? (b) : (a))
#define MAX	0x3f3f3f3f

/*
int count_zeros1(int n) {
	int t = 1, p = 0;
	int count = 0;
	while (t < n) {
		t *= 5;
		p++;
		for (int i = 1 ; i * t <= n ; i++) {
			if (!(i % 5)) continue;
			count += p;
		}
	}

	return count;
}
*/

int count_zeros(int n) {
	int t = 1, p = 0;
	int count = 0;
	while (t < n) {
		t *= 5;
		p++;
		int f_count = n / t;
		f_count -= f_count / 5;
		count += f_count * p;
	}

	return count;
}

void solve1(long long p) {
	int n;
	int step, z1;
	int z2 = MAX, res = MAX;
	for (step = 1 ; step < MAX ; step <<= 1);
	step >>= 1;
	for (n = 0 ; step ; step >>= 1) {
		int m = n | step;
		z1 = count_zeros(m);
		if (z1 <= z2 && z1 >= p && m < res) { z2 = z1; res = m; }
	//	fprintf(stderr, "%d %d\n", m, z1);
		if (z1 < p)
			n = m;
	}
	if (z2 == p)
		printf("%d\n", res);
	else
		printf("-1\n");

}

void solve2(long long p) {
	for (int i = 1 ; ; i++) {
		int z = count_zeros(i);
		if (z >= p) {
			if (z > p) printf("-1\n");
			else printf("%d\n", i);
			return;
		}
	}
}

int main() {
	freopen("fact.in", "r", stdin);
	freopen("fact.out", "w", stdout);

	long long p;

	scanf("%llu", &p);

	if (!p) {
		printf("1\n");
		return 0;
	}

//	for (p = 1 ; p < 10000 ; p++) {
//		solve1(p);
//		solve2(p);
//	}
	
	solve2(p);
	return 0;
}