Pagini recente » Borderou de evaluare (job #1054278) | Cod sursa (job #1200783) | Cod sursa (job #2620962) | Cod sursa (job #982781) | Cod sursa (job #521210)
Cod sursa(job #521210)
#include <stdio.h>
long long n,m,p,v[20],d,div,s;
void back(int a,long long prod,int ok)
{
if (a==d+1)
{
if (prod==1) return;
s+=ok*(div/prod);
return;
}
back(a+1,prod*v[a],-ok);
back(a+1,prod,ok);
}
int main()
{
long long i,step,add,r;
freopen("frac.in","r",stdin);
freopen("frac.out","w",stdout);
scanf("%I64d%I64d",&n,&p);
m=n;
for (i=2;i*i<=m;++i)
{
if (!(m%i))
{
++d;
v[d]=i;
m/=i;
while (!(m%i)) m/=i;
}
}
if (m!=1)
{
++d;
v[d]=m;
}
div=n;r=n;
back(1,1,-1);
add=(p/(n-s))*n;
p%=s;
for (step=1;step<=r;step<<=1);
for (i=1;step;step>>=1)
{
s=0;div=i+step;
back(1,1,-1);
if (i+step<=r&&(n-s)==p) i+=step;
}
printf("%I64d",i+add);
return 0;
}