Pagini recente » Cod sursa (job #2698134) | Cod sursa (job #3190037) | Cod sursa (job #87647) | Cod sursa (job #721964) | Cod sursa (job #112616)
Cod sursa(job #112616)
#include <stdio.h>
#define NMAX 20
long long n,k,st,dr,nr,mid,div[NMAX],x,i,j;
void back(long long nivel, long long nr1, long long p)
{
if (p>mid) return;
if (nivel==div[0]+1)
{
if (nr1==0) return;
if (nr1%2==0) x-=mid/p;
else x+=mid/p;
return;
}
back(nivel+1,nr1,p);
back(nivel+1,nr1+1,p*div[nivel]);
}
int main()
{
freopen("frac.in","r",stdin);
freopen("frac.out","w",stdout);
scanf("%lld %lld",&n,&k);
st=1; dr= (long long)1<<61;
for (i=2;i*i<=n;i++)
{
if (n%i) continue;
div[ ++div[0] ] = i;
for (;n%i==0;n/=i);
}
if (n>1) div[ ++div[0] ]=n;
while (st<dr-1)
{
mid=(st+dr)/2;
x=0;
nr=mid;
back(1,0,1);
nr-=x;
if (nr<k) st=mid;
else dr=mid;
}
nr=st;
back(1,0,1);
nr-=x;
if (nr==k) printf("%lld",st);
else printf("%lld",dr);
return 0;
}