Cod sursa(job #1896030)

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

using namespace std;

int factor, exponent;

struct DESC {
    int f, e;
};

vector <DESC> v;

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) {
            v.push_back({d, e});
        }
        ++ d;
    }
    if(n > 1) {
        v.push_back({n, 1});
    }
}

int p, q;
long long maxim = 0;

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 = 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;
        }
    }
    if(last > maxim)
        maxim = last;
}

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

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

    for(int i = 0; i < v.size(); ++ i) {
        factor = v[i].f;
        exponent = v[i].e * q;
        binar();
    }


    printf("%d\n", maxim);

    return 0;
}