Pagini recente » Cod sursa (job #2386217) | Cod sursa (job #2963916) | Cod sursa (job #2783539) | Cod sursa (job #2305596) | Cod sursa (job #2135509)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("frac.in");
ofstream fout ("frac.out");
const short Valmax = 15;
int k, st[Valmax], cnt;
long long n, p, prim[Valmax];
vector < int > L[1 << Valmax];
inline void Desc()
{
int d = 2;
if(n % d == 0)
{
++k;
prim[k] = d;
while(n % d == 0)
n /= d;
}
d++;
while(n > 1 && 1LL * d * d <= n)
{
if(n % d == 0)
{
prim[++k] = d;
while(n % d == 0)
n /= d;
}
d += 2;
}
if(n > 1)
prim[++k] = n;
}
void Back(int top)
{
if(top == (k + 1))
{
++cnt;
for(int i = 1 ; i <= k ; i++)
L[cnt] . push_back(st[i]);
}
else for(int i = 0 ; i <= 1 ; i++)
{
st[top] = i;
Back(top + 1);
}
}
inline long long CHECK(long long mij)
{
int ind, nr;
long long s , sol = 0;
for(int i = 2 ; i <= cnt ; i++)
{
ind = 1;
nr = 0;
s = 1;
for(auto j : L[i])
{
if(j == 1)
{
++nr;
s = 1LL * s * prim[ind];
}
ind++;
}
if(nr % 2 == 1)
sol += (mij / s);
else sol -= (mij / s);
}
sol = mij - sol;
return sol;
}
inline void Binary_Search()
{
long long stg = 1, drp = (1LL << 61), mij , poz;
while(stg <= drp)
{
mij = (stg + drp) / 2;
if(CHECK(mij) >= p)
{
poz = mij;
drp = mij - 1;
}
else stg = mij + 1;
}
fout << poz << "\n";
}
int main()
{
fin >> n >> p;
Desc();
Back(1);
Binary_Search();
fin.close();
fout.close();
return 0;
}