Pagini recente » Cod sursa (job #1485145) | Cod sursa (job #1190825) | Cod sursa (job #2700344) | Cod sursa (job #563087) | Cod sursa (job #1896040)
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
long long factor, exponent;
struct DESC {
long long f, e;
};
vector <DESC> v;
void descompunere(long long n) {
long long d = 2, e, lim;
lim = (long long)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});
}
}
long long p, q;
long long maxim = 0;
bool ok(long long b) {
long long 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 = 1LL << 60;
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("%lld%lld", &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("%lld\n", maxim);
return 0;
}