Pagini recente » Cod sursa (job #1885179) | Cod sursa (job #739140) | Cod sursa (job #1361919) | Istoria paginii runda/runda_ezoterica_3 | Cod sursa (job #1117009)
#include<stdio.h>
#include<math.h>
const int NMAX = 6e6;
long long n, p, subm[NMAX + 5];
long long count (long long x) {
int i;
long long ans = x;
for(i = 1; i <= subm[0]; i++)
ans += x / subm[i];
return ans;
}
long long bs (long long left, long long right) {
long long mid, last;
while(left <= right) {
mid = right + (left - right) / 2;
if(count(mid) >= p)
last = mid,
right = mid - 1;
else
left = mid + 1;
}
return last;
}
void fact () {
long long p, bit, cnt, d, lim, s, cn, f[30];
int e;
d = 2;
e = f[0] = 0;
cn = n;
lim = sqrt(cn);
while(cn > 1 && d <= lim) {
while(cn % d == 0)
e = 1,
cn /= d;
if(e)
f[++f[0]] = d;
++d;
}
if(cn > 1)
f[++f[0]] = cn;
for(s = 1; s < (1 << f[0]); s++) {
cnt = 0;
p = 1;
for(bit = 0; bit < f[0]; bit++)
if(s & (1 << bit))
++cnt,
p *= f[bit + 1];
if(cnt % 2 == 1)
p *= -1;
subm[++subm[0]] = p;
}
}
int main() {
freopen("frac.in","r",stdin);
freopen("frac.out","w",stdout);
scanf("%lld%lld",&n,&p);
fact();
printf("%lld\n",bs(1, (long long)1 << 61));
return 0;
}