Cod sursa(job #2206574)

Utilizator radu.hobincuRadu Hobincu radu.hobincu Data 22 mai 2018 23:45:52
Problema Factorial Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <cmath>
#include <cstdio>
#include <cstdint>

uint64_t getZeros(uint32_t n) {
    //unsigned limit = log(n) / log(5);
    //uint64_t z = n * (0.2 * (1 - pow(0.2, limit)) / 0.8);
    uint64_t z = 0;
    for(uint32_t i = 5; i <= n; i*=5) {
        z += n / i;
    }
    //printf("Zeroes(%u!) = %lu\n", n, z);
    return z;
}

int main() {
    freopen("fact.in", "r", stdin);
    freopen("fact.out", "w", stdout);
    unsigned p;
    scanf("%u", &p);

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

    uint32_t start = 5;
    uint32_t end = 100000000;
    uint32_t middle;
    uint64_t zeros;
    while(true) {
        middle = (start + end) / 2;
        zeros = getZeros(middle);
        if(zeros == p || start == middle || end == middle) break;
        if(zeros > p) end = middle;
        else start = middle;
    }

    if(zeros == p) printf("%lu\n", middle / 5LU * 5LU);
    else printf("-1\n");

    return 0;
}