Pagini recente » Cod sursa (job #2651845) | Cod sursa (job #981858) | Cod sursa (job #2631071) | Cod sursa (job #1137475) | Cod sursa (job #1748771)
#include <iostream>
#include <cstdio>
using namespace std;
long long n, p;
long long fact[50];
int nq;
void prepare()
{
for (long long d = 2; d * d <= n; d++)
{
if (n % d == 0)
fact[nq++] = d;
while (n % d == 0) n /= d;
}
if (n != 1)
fact[nq++] = n;
}
long long numara(long long cine)
{
int bt = 1, fin = (1<<nq);
long long rez = 0;
for (; bt < fin; bt++) {
int flip = 0;
long long nr = 1;
for (int i = 0; i < nq; i++)
if (bt & (1<<i)) {
flip++;
nr *= fact[i];
}
if (flip & 1)
rez += (cine/nr);
else
rez -= (cine/nr);
}
return cine - rez;
}
void solve()
{
long long val = 1, step = 1LL<<61;
for ( ; step; step >>= 1) {
long long valide = numara(val+step);
if (valide < p)
val += step;
}
printf("%lld", val+1);
}
int main()
{
freopen("frac.in", "r", stdin);
freopen("frac.out", "w", stdout);
scanf("%lld %lld", &n, &p);
prepare();
solve();
return 0;
}