Pagini recente » Cod sursa (job #1702251) | Cod sursa (job #2281335) | Cod sursa (job #1944982) | Cod sursa (job #268092) | Cod sursa (job #594687)
Cod sursa(job #594687)
#include <cstdio>
using namespace std;
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);
if (n==1)
{
printf("%lld\n",p);
return 0;
}
if (p==1)
{
printf("1");
return 0;
}
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%=(n-s);
if (!p)
{
printf("%lld\n",add-1);
return 0;
}
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&&(i+step-s)<p)
i+=step;
}
printf("%lld\n",i+add+1);
return 0;
}