Pagini recente » Cod sursa (job #2914832) | Cod sursa (job #2126100) | Cod sursa (job #2838253) | Cod sursa (job #2587861) | Cod sursa (job #462677)
Cod sursa(job #462677)
#include <stdio.h>
long long n, p;
int prim[20];
void desc ()
{
long long i;
for (i = 2; i * i <= n; i ++)
if (n % i == 0)
{
prim[++ prim[0]] = i;
while (n % i == 0)
n /= i;
}
if (n > 1)
prim[++ prim[0]] = n;
}
long long fractii (long long x)
{
int i, j, p, lim = (1 << prim[0]) - 1;
long long nr = 0;
for (i = 0; i <= lim; i ++)
{
p = 1;
for (j = 1; j <= prim[0]; j ++)
if (i & (1 << j - 1))
p = p * -1 * prim[j];
nr = nr + x / p;
}
return nr;
}
int main ()
{
freopen ("frac.in", "r", stdin);
freopen ("frac.out", "w", stdout);
scanf ("%lld %lld\n", &n, &p);
desc ();
long long st = 0, dr = 1LL << 61, m, sol = 0;
while (st <= dr)
{
m = (st + dr) >> 1;
if (fractii (m) >= p)
{
sol = m;
dr = m - 1;
}
else
st = m + 1;
}
while (fractii (sol) < p && fractii (sol - 1) < p)
sol ++;
printf ("%lld\n", sol);
return 0;
}