Cod sursa(job #949100)

Utilizator MathPlayerPopescu Bogdan Constantin MathPlayer Data 12 mai 2013 14:54:53
Problema Factorial Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <stdio.h>
 
#define INPUT_FILE  "fact.in"
#define OUTPUT_FILE "fact.out"
#define TRUE        1
#define FALSE       0
#define INVALID_RESULT  -1
 
/***   DATA   VARIABLES   ***/
FILE *f;
unsigned long long p, n = INVALID_RESULT;
 
/***   READ   AND   WRITE   FUNCTIONS   ***/
void read()
{
    f = fopen(INPUT_FILE, "rt");
    fscanf(f, "%lld", &p);
    fclose(f);
}
 
void write()
{
    f = fopen(OUTPUT_FILE, "wt");
    fprintf(f, "%lld", n);
    fclose(f);
}
 
 
/***   SOLVING   PROBLEM   FUNCTIONS   ***/
unsigned long long getZeros(unsigned long long value)
{
    unsigned long long x;
    unsigned long long answer = 0;
    for (x = 5; x <= value; x *= 5)
        answer += value / x;
    return answer;
}
 
void solve()
{
    unsigned long long min = 0, max = 500000000;
    unsigned long long med, zeros;
    if (p < min || p > max) {
        n = INVALID_RESULT;
        return;
    }
 
    while (min < max) {
        med = (min + max) / 2;
        zeros = getZeros(med);
 
        if (zeros == p) {
            if (med < 5)
                n = 1;
            else
                n = med - med % 5;
            return;
        } else if (zeros > p) {
            max = med - 1;
        } else {
            min = med + 1;
        }
    }
    if (min == max &&(zeros = getZeros(min)) == p)
        n = zeros;
    else
        n = INVALID_RESULT;
}
 
 
/***   MAIN   ***/
int main()
{
    read();
    solve();
    write();
    return 0;
}