Cod sursa(job #1896008)

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

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 > 1) {
            factor = d;
            exponent = e;
        }
        ++ d;
    }
    if(n > 1) {
        factor = n;
        exponent = 1;
    }
}

int p, q;

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

void binar() {
    long long st, dr, med, last = -1;
    st = 1;
    dr = 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);

    scanf("%d%d", &p, &q);
    if(p == 1) {
        printf("1");
        return 0;
    }
    descompunere(p);
    exponent *= q;

    binar();

    return 0;
}