Pagini recente » Cod sursa (job #1378351) | Cod sursa (job #1561221) | Cod sursa (job #1332546) | Cod sursa (job #2329936) | Cod sursa (job #521242)
Cod sursa(job #521242)
#include <stdio.h>
long long n,m,p,v[20],d,dei,s;
void back(long long a,long long prod,long long ok)
{
if (a==d+1)
{
if (prod==1) return;
s+=ok*(dei/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("%lld%lld",&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;
}
dei=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;dei=i+step;
back(1,1,-1);
if (i+step<=r&&(n-s)==p) i+=step;
}
printf("%lld",i+add);
return 0;
}