Pagini recente » Cod sursa (job #2267454) | Cod sursa (job #3152544) | Cod sursa (job #1059435) | Cod sursa (job #2582826) | Cod sursa (job #1456657)
# include <bits/stdc++.h>
# define ll long long
using namespace std;
ifstream fi("frac.in");
ofstream fo("frac.out");
const int nmax = 1e6 + 55;
bitset < nmax > b;
vector < int > prim;
vector < int > fact;
int k;
ll ans(ll a,ll n)
{
int d = -1;
fact.clear();
while (n > 1)
{
++d;
if (!(n%prim[d]))
{
fact.push_back(prim[d]);
while (!(n%prim[d])) n /= prim[d];
}
if (prim[d] > sqrt(n) && n != 1)
{
fact.push_back(n);n = 1;
}
}
k = fact.size();
int l = 1 << k;
ll sol = 0;
for (ll p = 1;p < l;++p)
{
ll nr = 0;
ll pr = 1;
for (int i = 0;i < k;++i) if ((1LL << i)&p) ++nr,pr *= fact[i];
if (nr&1) nr = 1;else nr = -1;
sol += a / (pr*nr);
}
return a - sol;
}
int main(void)
{
ll x,y;
for (int i = 3;i <= 1e6;i += 2) b[i] = 1;
prim.push_back(2);
for (int i = 3;i <= 1e3;i += 2)
if (b[i])
{
prim.push_back(i);
for (int j = i*i;j <= 1e6;j += i) b[j] = 0;
}
for (int i = 1e3+1;i <= 1e6;++i) if (b[i]) prim.push_back(i);
fi>>x>>y;
ll p = 1,u = 1LL << 61;
ll bst = 1LL << 61;
while (p <= u)
{
ll m = (p + u) / 2;
if (ans(m,x) < y) p = m + 1;
else bst = min(bst,m),u = m - 1;
}
return fo << bst << '\n',0;
}