Pagini recente » Cod sursa (job #2111850) | Cod sursa (job #1553701) | Cod sursa (job #27551) | Cod sursa (job #1843523) | Cod sursa (job #1895999)
#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);
if(p == 1) {
printf("1");
return 0;
}
descompunere(p);
binar(v.size() - 1);
return 0;
}