Pagini recente » Cod sursa (job #273946) | Cod sursa (job #591276) | Cod sursa (job #1155971) | Cod sursa (job #2452057) | Cod sursa (job #2832684)
#include <fstream>
#include <climits>
#include <vector>
using namespace std;
ifstream cin("gfact.in");
ofstream cout("gfact.out");
int fact(int x, int div)
{
int ans = 0;
for (; x >= div; x /= div)
ans += x / div;
return ans;
}
vector <pair <int, int> > help;
vector <int> prime;
const int VALMAX = 44721;
bool v[VALMAX + 3];
void ciur()
{
prime.push_back(2);
for (int i = 3; i * i <= VALMAX; i += 2)
for (int j = i * i; j <= VALMAX; j += (i << 1))
v[j] = 1;
for (int i = 3; i <= VALMAX; i += 2)
if (!v[i])
prime.push_back(i);
}
int main()
{
int p, q;
cin >> p >> q;
ciur();
//desc
for (int i = 0; i < prime.size() and prime[i] * prime[i] <= p;
i++
)
{
if (p % prime[i])
continue;
int aux = 0;
while (p % prime[i] == 0)
{
aux++;
p /= prime[i];
}
help.push_back({prime[i], aux * q});
}
if (p > 1)
help.push_back({p, q});
int st = 1, dr = INT_MAX - 1, sol = -1;
while (st <= dr)
{
int med = ((st + dr) >> 1);
bool ok = 0;
for (int i = 0; i < help.size(); i++)
{
int val = fact(med, help[i].first);
if (val < help[i].second)
{
ok = 1;
break;
}
}
if (!ok)
{
sol = med;
dr = med - 1;
}
else st = med + 1;
}
cout << sol;
}