Pagini recente » Cod sursa (job #2077545) | Cod sursa (job #1317246) | Cod sursa (job #2048545) | Cod sursa (job #2863744) | Cod sursa (job #1149061)
#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <iomanip>
#include <string>
#include <cmath>
using namespace std;
vector< pair<int,int> > factor(const int& x) {
vector< pair<int, int> > ret;
int t = x, c;
int p = 0;
while ((t & 1) == 0) {
t >>= 1;
p++;
}
if (p) ret.push_back({ 2, p });
for (int d = 3; d * d <= t; d += 2) {
p = 0;
while (t > 1 && t - (c = t / d) * d == 0) {
t = c;
p++;
}
ret.push_back({ d, p });
}
if (t > 1) ret.push_back({ t, 1 });
return ret;
}
inline bool check(const long long& val,const vector< pair<int, int> >& factors) {
for (int i = 0; i < (int)factors.size(); i++) {
long long d = factors[i].first;
long long p = 0;
while (d <= val) {
p += val / d;
d *= factors[i].first;
}
if (p < factors[i].second) return false;
}
return true;
}
int main()
{
ifstream cin("gfact.in");
ofstream cout("gfact.out");
int p, q;
cin >> p >> q;
vector< pair<int, int> > f = factor(p);
for (auto& x : f) {
x.second *= q;
}
long long left = 1;
long long right = 1ll << 38;
while (left <= right) {
long long mid = left + (right - left) / 2;
if (check(mid, f)) {
right = mid - 1;
} else {
left = mid + 1;
}
}
cout << left << " ";
return 0;
}