Pagini recente » Borderou de evaluare (job #821617) | Cod sursa (job #196774) | Cod sursa (job #2191422) | Cod sursa (job #1173081) | Cod sursa (job #1402705)
#include<cstdio>
#include<algorithm>
#include<cstring>
#define Nmax 109555
using namespace std;
long long n,p,i,j,pr[Nmax/10];
bool w[Nmax];
long long d[1005];
void numereprime()
{
long long i,j;
for (i=2;i<=Nmax-5;i++)
if (!w[i])
{
pr[++pr[0]]=i;
for (j=i*i;j<=Nmax-5;j+=i)
w[j]=1;
}
}
void desc(long long x)
{
long long i;
for (i=1;pr[i]*pr[i]<=x;i++)
if (x%pr[i]==0)
{
while (x%pr[i]==0) x=x/pr[i];
d[++d[0]]=pr[i];
}
if (x!=1) d[++d[0]]=x;
}
long long cb(long long x)
{
long long st=1,dr,mij=0,q=0,nr,val,sol,k;
bool ok;
dr=2305843009213693952;
nr=1<<d[0]; nr--;
while (st<=dr)
{
mij=(st+dr)/2; sol=mij;
for (i=nr;i>=1;i--)
{
val=1; k=0;
for (j=1;j<=d[0];j++)
if (i&(1<<(j-1)))
{
k++;
val=val*d[j];
}
if (k%2==0) sol+=mij/val;
else sol-=mij/val;
}
ok=1;
if (sol==p)
for (j=1;j<=d[0];j++)
if (mij%d[j]==0)
{
ok=0;
break;
}
if (sol==p && ok) return mij;
if (sol<p) st=mij+1;
else dr=mij-1;
}
return 0;
}
int main()
{
freopen("frac.in","r",stdin);
freopen("frac.out","w",stdout);
scanf("%lld %lld",&n,&p);
numereprime();
desc(n);
printf("%lld",cb(p));
return 0;
}