Cod sursa(job #1896093)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 28 februarie 2017 13:52:28
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <cstdio>
#include <cmath>

using namespace std;

int factor, exponent;

void descompunere(int n) {
    int d = 2, e, lim;
    lim = (int)sqrt((double) n);
    while(d <= lim && n > 1) {
        e = 0;
        while(n % d == 0) {
            n /= d;
            ++ e;
        }
        if(e > 0) {
            factor = d;
            exponent = e;
        }
        ++ d;
    }
    if(n > 1) {
        factor = n;
        exponent = 1;
    }
}

bool ok(long long b) {
    long long rasp = 0;
    while(b) {
        b = b / factor;
        rasp = rasp + b;
    }
    if(rasp >= exponent)
        return 1;
    return 0;
}

void binar() {
    long long st, dr, med, last = -1;
    st = 0;
    dr = (long long) exponent * factor;
    while(st <= dr) {
        med = st + (dr - st) / 2;
        if(ok(med)) {
            last = med;
            dr = med - 1;
        } else {
            st = med + 1;
        }
    }
    printf("%lld\n", last);
}

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

    int p, q;
    scanf("%d%d", &p, &q);

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

    descompunere(p);
    exponent *= q;
    binar();

    return 0;
}