Pagini recente » Cod sursa (job #1964461) | Cod sursa (job #2379970) | Cod sursa (job #10643) | Cod sursa (job #1822445) | Cod sursa (job #3219730)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("frac.in");
ofstream fout("frac.out");
vector<int> divizori;
long long int rez(long long int a)
{
long long int rez1 = a;
for (int i = 1; i < (1 << divizori.size()); i++)
{
long long int sclav = 1;
int cnt = 0;
for (int j = 0; j < divizori.size(); j++)
{
if ((1 << j) & i)
{
sclav *= divizori[j];
cnt++;
}
}
if (cnt % 2)
rez1 -= a / sclav;
else
rez1 += a / sclav;
}
return rez1;
}
int n, p;
int main()
{
fin >> n >> p;
int sclav = n;
for (int i = 2; sclav != 1 && i*i<=n; i++)
{
if (sclav % i == 0)
divizori.push_back(i);
while (sclav % i == 0)
{
sclav /= i;
}
}
if(sclav!=1)
divizori.push_back(sclav);
long long int st = 1;
long long int dr = (1LL << 61);
long long int sol;
while (st <= dr)
{
long long int mij = (st + dr) / 2;
long long int k = rez(mij);
if (k < p)
{
st = mij + 1;
sol = st;
}
else
{
dr = mij - 1;
}
}
fout<<sol;
}