Pagini recente » Cod sursa (job #767505) | Cod sursa (job #725763) | Cod sursa (job #3220453) | Cod sursa (job #2581521) | Cod sursa (job #3245705)
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
ifstream in("frac.in");
ofstream out("frac.out");
long long i, j, st, dr, mid, n, mask, k, o;
vector <long long> v;
long long v1[] = {-1, 1};
long long futere()
{
long long ans = 0;
for (long long mask = 1; mask < (1ll<<k); mask++)
{
long long p = 1, nr = 0;
for (long long j = 0; j < k; j++)
{
if (mask & (1ll << (j)))
{
nr++;
p *= v[j];
}
}
if (nr % 2 == 0)
ans -= mid/p;
else
ans += mid/p;
}
ans = mid - ans;
return ans;
}
void func()
{
bool ok = 0;
while (n % i == 0)
{
n/=i;
ok=1;
}
if(ok==0)
return;
v.push_back(i);
}
int main()
{
o = 61;
dr = (1ll<<o) + 1ll;
in >> n >> o;
i=2;
func();
for (i = 3; i * i <= n; i += 2)
func();
if (n != 1)
v.push_back(n);
k=v.size();
while (st <= dr)
{
mid = (st+dr)/2;
long long ans = futere();
if (ans < o)
st = mid+1;
else
dr = mid - 1;
}
out << mid << '\n';
return 0;
}