Pagini recente » Cod sursa (job #2608492) | Cod sursa (job #396810) | Cod sursa (job #3001693) | Cod sursa (job #2301177) | Cod sursa (job #211702)
Cod sursa(job #211702)
#include<stdio.h>
int prim[20];
long long n,p;
long long cate;
void precalc()
{
long long n1=n;
for(long long i=2; n1!=1; i++)
{
prim[++prim[0]]=i;
while(n1%i==0)
n1/=i;
}
cate=1<<prim[0];
}
long long f(long long x)
{
long long rez=x;
long long aux,j,k,nrb;
//for(int i=1; i<=prim[0]; i++)
// rez+=(long long)(x/(long long)prim[i]);
for(long long i=1; i<cate; i++)
{
aux=1;
nrb=0;
j=i;
for(k=1; j; k++,j>>=1)
{
if(j&1)
{
aux*=prim[k];
nrb++;
}
}
if(nrb&1)
rez-=x/aux;
else
rez+=x/aux;
}
return rez;
}
void caut()
{
long long st=1,dr=1LL<<51,m,aux;
while(st!=dr)
{
m=(st+dr)>>1;
aux=f(m);
if(p<=aux)
dr=m;
else
st=m+1;
}
//while(f(st)==p)
// st--;
printf("%lld\n",st);
//printf("%lld\n",f(13));
}
int main()
{
freopen("frac.in","r",stdin);
freopen("frac.out","w",stdout);
scanf("%lld%lld",&n,&p);
precalc();
caut();
return 0;
}