Pagini recente » Cod sursa (job #972610) | Cod sursa (job #1916840) | Cod sursa (job #593042) | Cod sursa (job #1438613) | Cod sursa (job #1239716)
#include<cstdio>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<bitset>
#include<deque>
#include<queue>
#include<set>
#include<map>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<unordered_map>
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define pll pair<ll,ll>
using namespace std;
ll N, P, l, r, m, sol, lim, i, j, p[200005], q, f[15], g, cnt, nr;
bitset<200005> viz;
void sieve()
{
lim = 200000;
p[++q] = 2;
for(i = 3; i * i <= lim; i += 2)
if(!viz[i])
{
p[++q] = i;
for(j = i * i; j <= lim; j += i * 2)
viz[j] = 1;
}
for(; i <= lim; i += 2)
if(!viz[i])
p[++q] = i;
}
void factorize(ll N)
{
g = -1;
for(i = 1; i <= q && p[i]*p[i] <= N; i++)
if(N % p[i] == 0)
{
f[++g] = p[i];
while(N % p[i] == 0)
N /= p[i];
}
if(N > 1) f[++g] = N;
g++;
lim = 1 << g;
}
ll check(ll x)
{
ll r = 0;
for(i = 1; i < lim; i++)
{
cnt = 0;
nr = 1;
for(j = 0; j < g; j++)
if((1 << j) & i)
{
cnt++;
nr *= f[j];
}
if(cnt & 1) r += x / nr;
else r -= x / nr;
}
return x - r;
}
void binsearch()
{
l = 1;
r = 1LL << 61;
while(l <= r)
{
m = (l + r) / 2;
if(check(m) >= P)
{
sol = m;
r = m - 1;
}
else
l = m + 1;
}
}
int main()
{
freopen("frac.in", "r", stdin);
freopen("frac.out", "w", stdout);
scanf("%lld%lld", &N, &P);
sieve();
factorize(N);
binsearch();
printf("%lld\n", sol);
return 0;
}