Pagini recente » Cod sursa (job #2738263) | Cod sursa (job #145884) | Cod sursa (job #1749398) | sim_oji2012_1 | Cod sursa (job #88909)
Cod sursa(job #88909)
#include <cstdio>
#include <cmath>
#define Nmax 16
#define ll long long
int ct;
ll sir[Nmax];
ll n, p;
void citire()
{
scanf("%lld %lld", &n, &p);
}
ll count(ll nr)
{
int mask, cnt, i;
ll d;
ll ret = 0;
for (mask = 0; mask < 1 << ct; ++mask)
{
cnt = 0;
d = 1;
for (i = 1; i <= ct; ++i)
if ((mask >> (i - 1)) & 1)
{
d *= sir[i];
++cnt;
}
if (cnt % 2 == 0)
ret += nr / d;
else
ret -= nr / d;
}
return ret;
}
void solve()
{
int i, rad = (int)sqrt(n);
ll t = n, st, dr, mij, sol = 0;
for (i = 2; i <= rad; ++i)
if (t % i == 0)
{
sir[++ct] = i;
while (t % i == 0)
t /= i;
}
if (t != 1) sir[++ct] = t;
st = 1;
dr = 1;
dr <<= 62;
while (st <= dr)
{
mij = (st + dr) >> 1;
if (count(mij) >= p)
{
sol = mij;
dr = mij - 1;
}
else
st = mij + 1;
}
printf("%lld\n", sol);
}
int main()
{
freopen("frac.in", "r", stdin);
freopen("frac.out", "w", stdout);
citire();
solve();
return 0;
}