Cod sursa(job #2251937)

Utilizator gabrielmGabriel Majeri gabrielm Data 2 octombrie 2018 09:58:52
Problema Factorial Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.1 kb
#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));
}