Cod sursa(job #1023169)

Utilizator impulseBagu Alexandru impulse Data 6 noiembrie 2013 15:39:18
Problema Factorial Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 1.22 kb
//
//  main.c
//  fact
//
//  Created by Alexandru Bâgu on 11/6/13.
//  Copyright (c) 2013 Alexandru Bâgu. All rights reserved.
//

#include <stdio.h>
int* pOf5;

int make5()
{
    pOf5 = (int*) malloc(sizeof(int) * 13);
    int p = 1;
    pOf5[0] = 1;
    int k = 13;
    while(k)
    {
        pOf5[p] = 5 * pOf5[p-1],
        k--;
        p++;
    }
    return 0;
}
int get5(int k)
{
    int m = 13;
    int p = 1 << 7;
    int pos = 0;
    for(;p > 0; p>>=1)
        if(pos + p < m)
            if(pOf5[pos + p] <= k)
                pos += p;
    if(pOf5[pos] == k) return pos;
    return 0;
}

int valid(int k, int res)
{
    int j = 0;
    int i;
    for(i = 5; i < k; i+=5)
    {
        j++;
        if((i / 5) % 5 == 0)
            j+= get5(i);
    }
    return j <= res;
}

int binsea(int k)
{
    int max = k * 5;
    int p = 1 << 30;
    int pos = 0;
    for(;p > 0; p>>=1)
        if(pos + p <= max)
            if(valid(pos + p, k))
                pos += p;
    return pos;
}

int main(int argc, const char * argv[])
{
    make5();
    FILE *in = fopen("fact.in", "r"),
        *out = fopen("fact.out", "w");
    int k;
    fscanf(in, "%d", &k);
    int a = binsea(k);
    if(a == 0) a ++;
    fprintf(out, "%d", a);
    return 0;
}