Cod sursa(job #1821406)

Utilizator deresurobertoFMI - Deresu Roberto deresuroberto Data 3 decembrie 2016 01:15:37
Problema Factorial Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <fstream>
#define nsz 29
using namespace std;
long long n, sol, powersOf5[nsz + 1], numOfZerosByPowOf5[nsz + 1], partialSumOfNumOfZerosByPowOf5[nsz + 1];

ifstream fin("fact.in");
ofstream fout("fact.out");

int main()
{
    fin >> n;

    powersOf5[0] = 1;
    for (int i = 1; i <= nsz; i++)
    {
        powersOf5[i] = powersOf5[i - 1] * 5;
        numOfZerosByPowOf5[i] = numOfZerosByPowOf5[i - 1] + powersOf5[i] / 5;
        partialSumOfNumOfZerosByPowOf5[i] = partialSumOfNumOfZerosByPowOf5[i-1] + numOfZerosByPowOf5[i];
    }

    if (n == 0)
        sol = 1;

    while (n > 0)
    {
        int i = 1;
        while (n >= numOfZerosByPowOf5[i + 1] && i < 30)
            i++;

        if (n <= 4 * partialSumOfNumOfZerosByPowOf5[i])
        {
            int d = (int)n / numOfZerosByPowOf5[i];
            n -= d * numOfZerosByPowOf5[i];
            sol += d * powersOf5[i];
        }
        else
        {
            n = -1;
        }
    }

    if (n == 0)
        fout << sol;
    else
        fout << "-1";

    return 0;
}