Cod sursa(job #2074152)

Utilizator copanelTudor Roman copanel Data 24 noiembrie 2017 09:47:32
Problema GFact Scor 90
Compilator c Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>

#define L 30

int div[300], exp[300];
int nrdiv, q;

int divd(int n, int d) {
    int nr = 0;
    while (n >= d)
        nr += n /= d;
    return nr;
}

int okek(int n) {
    int i = 0;
    while (i < nrdiv && divd(n, div[i]) >= exp[i] * q)
        i++;
    return i >= nrdiv;
}

int main()
{
    FILE *fin, *fout;
    int p, d, e, i, pas, r;

    fin = fopen("gfact.in", "r");
    fscanf(fin, "%d%d", &p, &q);
    fclose(fin);

    d = 2;
    nrdiv = 0;
    while (d * d <= p) {
        if (p % d == 0) {
            e = 0;
            while (p % d == 0) {
                e++;
                p /= d;
            }
            div[nrdiv] = d;
            exp[nrdiv] = e;
            nrdiv++;
        }
        d++;
    }
    if (p > 1) {
        div[nrdiv] = p;
        exp[nrdiv] = 1;
        nrdiv++;
    }

    pas = 1 << L;
    r = 0;
    while (pas != 0) {
        if (!okek(r + pas)) {
            r += pas;
        }
        pas >>= 1;
    }

    fout = fopen("gfact.out", "w");
    fprintf(fout, "%d", r + 1);
    fclose(fout);
    return 0;
}