Pagini recente » Cod sursa (job #996809) | Cod sursa (job #2876642) | Cod sursa (job #296293) | Cod sursa (job #900798) | Cod sursa (job #1329559)
#include <cstdio>
using namespace std;
int fact[20], expp[20];
int M;
void desc(int n, int q) {
int d, e;
d = 2;
while(n > 1 && 1LL * d * d <= n) {
e = 0;
while(n % d == 0) {
n /= d;
++ e;
}
if(e) {
fact[++ M] = d;
expp[M] = e * q;
}
++ d;
if(!(d & 1))
++ d;
}
if(n > 1) {
fact[++ M] = n;
expp[M] = q;
}
}
bool ok(long long n, int p, int e) {
long long pp = 0;
while(n) {
pp = pp + n / p;
n /= p;
}
if(pp >= e)
return 1;
return 0;
}
long long bin(int p, int e) {
long long med, last = -1, st = 1, dr = 1LL << 60;
while(st <= dr) {
med = st + (dr - st) / 2;
if(ok(med, p, e)) {
last = med;
dr = med - 1;
} else {
st = med + 1;
}
}
return last;
}
int main() {
freopen("gfact.in", "r", stdin);
freopen("gfact.out", "w", stdout);
int p, q;
long long pq, rasp = 0;
scanf("%d%d", &p, &q);
desc(p, q);
for(int i = 1; i <= M; ++ i) {
pq = bin(fact[i], expp[i]);
if(pq > rasp) {
rasp = pq;
}
}
printf("%lld\n", rasp);
return 0;
}