Pagini recente » Cod sursa (job #1851673) | Cod sursa (job #1025623) | Cod sursa (job #2762680) | Cod sursa (job #882426) | Cod sursa (job #2872935)
#include <fstream>
#include <vector>
using namespace std;
vector <int> d;
long long nr(long long med)
{
int dim = (1 << d.size());
long long ans = 0;
for (int i = 1; i < dim; i++)
{
long long prod = 1;
int cnt = 0;
for (int j = 0; (1 << j) <= i; j++)
if (i & (1 << j))
{
cnt++;
prod *= d[j];
}
if (cnt % 2 == 0)
ans -= med / prod;
else
ans += med / prod;
}
return med - ans;
}
int main()
{
ifstream cin("frac.in");
ofstream cout("frac.out");
int n, p;
cin >> n >> p;
int dv = 2;
while (dv * dv <= n)
{
if (n % dv == 0)
{
d.push_back(dv);
while (n % dv == 0)
n /= dv;
}
dv++;
}
if (n > 1)
d.push_back(n);
long long st = 1, dr = (1LL << 61) - 1, med, sol = -1;
while (st <= dr)
{
med = ((st + dr) >> 1);
if (nr(med) >= p)
{
sol = med;
dr = med - 1;
}
else
st = med + 1;
}
cout << sol;
}