Pagini recente » Cod sursa (job #2269515) | Cod sursa (job #735312) | Cod sursa (job #1319273) | Cod sursa (job #1983904) | Cod sursa (job #3226224)
#include <fstream>
#define MAXD 1000000
#define INF 1000000000000000000
using namespace std;
ifstream cin ("frac.in");
ofstream cout ("frac.out");
int dv[MAXD + 10], cntDiv;
long long cntVal(long long x)
{
long long ans = 0;
for (int conf = 1; conf < (1 << cntDiv); conf++)
{
int ok = 0, cnt = 0;
long long divi = 1;
for (int i = 0; i < cntDiv && ok == 0; i++)
if ((1 << i) & conf)
{
cnt++;
divi = divi * dv[i + 1];
if (divi >= x)
ok = 1;
}
if (cnt % 2 == 1)
ans = ans + x / divi;
else
ans = ans - x / divi;
}
return ans;
}
int main()
{
long long n, p;
cin >> n >> p;
int d = 2;
while (d * d <= n)
{
int is = 0;
while (n % d == 0)
{
n = n / d;
is = 1;
}
if (is == 1)
{
cntDiv++;
dv[cntDiv] = d;
}
d++;
}
if (n != 1)
{
cntDiv++;
dv[cntDiv] = n;
}
long long left = 1, right = INF, ans = -1;
while (left <= right)
{
long long mid = (left + right) / 2;
if (p > mid - cntVal(mid))
left = mid + 1;
else
{
right = mid - 1;
ans = mid;
}
}
cout << ans;
return 0;
}