Pagini recente » Cod sursa (job #2693237) | Cod sursa (job #1530469) | Cod sursa (job #2003505) | Cod sursa (job #2634140) | Cod sursa (job #2108151)
#include <bits/stdc++.h>
using namespace std;
ifstream in("frac.in");
ofstream out("frac.out");
const long long ANSMAX = (1LL << 61);
long long n, p;
long long ans;
vector<long long> factori,pinex;
void descompunere();
long long check(long long arg)
{
long long ans = arg;
for(auto it: pinex)
ans -= arg / it;
return ans;
}
int main()
{
in >> n >> p;
descompunere();
for(int i = 1; i < (1 << factori.size()); i++)
{
long long prod = 1;
int semn = 0;
for(int j = 0; j < factori.size(); j++)
if(i & (1 << j))
{
semn++;
prod *= factori[j];
}
prod *= (semn % 2 ? 1 : -1);
pinex.push_back(prod);
}
long long st = 1, dr = ANSMAX, med, val;
while(st <= dr)
{
med = (st + dr) / 2;
val = check(med);
if(val < p)
st = med + 1;
else
{
dr = med - 1;
if(val == p)
ans = med;
}
}
out << ans << '\n';
return 0;
}
void descompunere()
{
for(long long d = 2; d * d <= n; d++)
if(n % d == 0)
{
factori.push_back(d);
while(n % d == 0)
n /= d;
}
if(n > 1) factori.push_back(n);
}