Pagini recente » Cod sursa (job #2414172) | Cod sursa (job #1251291) | Cod sursa (job #1688757) | Rating Szekely Dragos (Dragos20012001) | Cod sursa (job #2251937)
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
// Returneaza numarul de zerouri in `n!`,
// fara sa calculeze numarul in sine
int64_t fact_zero(int64_t n) {
int64_t nrz = 0;
// Nr de 0 corespunde numarului de factori `2 * 5`.
// Deoarece vom avea multi factori de `2`,
// este suficient sa numaram cati `5` apar.
for (int64_t i = 5; i <= n; i *= 5) {
nrz += n / i;
}
return nrz;
}
// Cauta binar intre `st` si `dr` numarul minim
// pentru care `n!` are exact `z` zerouri.
int64_t cauta(int64_t z, int64_t st, int64_t dr) {
if (dr < st) {
return -1;
}
int64_t m = st + (dr - st) / 2;
int64_t nr_zero = fact_zero(m);
// Bingo
if (m == 1 || (nr_zero == z && fact_zero(m - 1) < z)) {
return m;
} else if (nr_zero < z) {
// Nu avem destule zero-uri
return cauta(z, m + 1, dr);
} else {
// Prea multe zero-uri
return cauta(z, st, m - 1);
}
}
int main() {
// Fisiere I/O
FILE* fin = fopen("fact.in", "r");
FILE* fout = fopen("fact.out", "w");
int64_t p;
fscanf(fin, "%"PRId64, &p);
fprintf(fout, "%"PRId64"\n", cauta(p, 1, INT32_MAX));
}