Pagini recente » Cod sursa (job #291321) | Cod sursa (job #2752028) | Cod sursa (job #2099352) | Cod sursa (job #231615) | Cod sursa (job #1329484)
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
vector <int> fact, expp;
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.insert(fact.end(), d);
expp.insert(expp.end(), e * q);
++ M;
}
++ d;
}
if(n > 1) {
fact.insert(fact.end(), n);
expp.insert(expp.end(), q);
++ M;
}
}
inline bool ok(int n, int p, int e) {
int pp = 0;
while(n) {
pp = pp + n / p;
n /= p;
}
if(pp >= e)
return 1;
return 0;
}
inline int bin(int p, int e) {
int med, last = -1, st = 1, dr = (1LL << 31) - 1;
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, rasp = 0, pq;
scanf("%d%d", &p, &q);
desc(p, q);
for(int i = 0; i < M; ++ i) {
pq = bin(fact[i], expp[i]);
if(pq > rasp) {
rasp = pq;
}
}
printf("%d\n", rasp);
return 0;
}