Pagini recente » Statistici Puiu Robert (PuiuRobert) | Istoria paginii utilizator/beliver_x | Cod sursa (job #861491) | Istoria paginii runda/simulare_oji_a_10-a | Cod sursa (job #1336080)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <climits>
#define VALmax 1000000 + 10
#define val first
#define tmp second
#define ll long long
using namespace std;
ll a , b;
vector < ll > sol;
vector < pair < ll , ll > > prim;
void makePM(ll x)
{
ll crt = x;
ll i = 2;
if (crt % i == 0)
{
ll y = 0;
while (crt % i == 0)
{
crt /= i;
y++;
}
prim.push_back ( make_pair ( i , y * b ) );
}
for (i = 3; i * i <= x; i += 2)
if (crt % i == 0)
{
ll y = 0;
while (crt % i == 0)
{
crt /= i;
y++;
}
prim.push_back ( make_pair ( i , y * b ) );
}
if (crt > 1)
{
prim.push_back ( make_pair ( crt , b ) );
}
}
long long cb()
{
ll st = 1; ll dr = LONG_MAX; ll lg = prim.size();
for (ll mij = (st + dr) >> 1; st <= dr; mij = (st + dr) >> 1)
{
ll x = mij; ll y = 0;
if (!sol.empty()) sol.clear();
for (ll i = 0; i < lg; ++i)
{
y = 0; ll crt = prim[i].val;
while (crt <= x)
{
y += x / crt;
crt *= prim[i].val;
}
sol.push_back(y);
}
bool ok = true;
for (ll i = 0; i < lg; ++i)
if (sol[i] < prim[i].tmp) ok = false;
if (ok) dr = mij - 1;
else st = mij + 1;
}
return st;
}
int main()
{
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
scanf("%lld %lld", &a, &b);
makePM(a);
printf("%lld\n", cb());
return 0;
}