Cod sursa(job #1605109)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 18 februarie 2016 19:30:40
Problema Factorial Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <cstdio>

using namespace std;

int n;

int puteri[] = {25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625, 48828125, 244140625, 1220703125, 6103515625};

int main()
{
    freopen("fact.in", "r", stdin);
    freopen("fact.out", "w", stdout);

    scanf("%d", &n);

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

    int nr = 5 * n;
    int largest = -1;

    for(int i = 12; i >= 0; i--)
    {
        if(nr >= puteri[i])
        {
            largest = i;
            break;
        }
    }

    int numar[10];
    int numarx[10];
    int nnumar[10];
    int nnnumar[10];

    for(int i = 0; i < 10; i++)
    {
        numarx[i] = 0;
        numar[i] = 0;
        nnumar[i] = 0;
        nnnumar[i] = 0;
    }

    for(int i = largest; i >= 0; i--)
    {
        numar[i] = nr / puteri[i];
    }

    for(int i = 8; i >= 0; i--)
    {
        numar[i] -= numar[i + 1];
    }

    for(int i = 0; i < 10; i++)
    {
        nr -= numar[i] * (i + 1) * 5;
    }




    for(int i = largest; i >= 0; i--)
    {
        nnumar[i] = nr / puteri[i];
    }

    for(int i = 8; i >= 0; i--)
    {
        nnumar[i] -= nnumar[i + 1];
    }





    for(int i = largest; i >= 0; i--)
    {
        numarx[i] = nr / puteri[i];
    }

    for(int i = 8; i >= 0; i--)
    {
        numarx[i] -= numarx[i + 1];
    }

    for(int i = 9; i >= 0; i--)
    {
        nr += (numar[i] - numarx[i]) * (i + 1) * 5;
    }




    for(int i = largest; i >= 0; i--)
    {
        nnnumar[i] = nr / puteri[i];
    }

    for(int i = 8; i >= 0; i--)
    {
        nnnumar[i] -= nnnumar[i + 1];
    }

    for(int i = 0; i < 8; i++)
    {
        numar[i] = nnnumar[i] - nnumar[i];
    }

    for(int i = 9; i >= 0; i--)
    {
        nr -= numar[i] * (i + 1) * 5;
    }


    int tmp = nr;
    int verificare = 0;

    for(int i = largest; i >= 0; i--)
    {
        verificare += (tmp / puteri[i]);
    }

    verificare += tmp / 5;

    if(verificare != n)
    {
        printf("-1");
        return 0;
    }

    printf("%d", nr);


    return 0;
}