Cod sursa(job #1895997)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 28 februarie 2017 13:07:55
Problema GFact Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>
#include <cmath>
#include <vector>

using namespace std;

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;

bool ok(long long b, int factor) {
    int k;
    long long rasp = 0;
    k = v[factor].f;
    while(b) {
        rasp += b / k;
        b /= k;
    }
    if(rasp >= (long long) q * v[factor].e)
        return 1;
    return 0;
}

void binar(int factor) {
    long long st, dr, med, last = -1;
    st = 0;
    dr = (long long) q * v[factor].f * v[factor].e;
    while(st <= dr) {
        med = st + (dr - st) / 2;
        if(ok(med, factor)) {
            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);

    descompunere(p);

    binar(v.size() - 1);

    return 0;
}