Pagini recente » Cod sursa (job #2259947) | Cod sursa (job #2140304) | Cod sursa (job #650913) | Cod sursa (job #259654) | Cod sursa (job #2951781)
#include <fstream>
using namespace std;
ifstream fin ("frac.in");
ofstream fout ("frac.out");
long long x,i,j,nr,sol,p,k,d,a,st,mij,dr,b,s,pr;
long long n,v[80005],l[80005],di[80005],nrc;
bool ciur[1000005];
bool f (long long a)
{
s=0;
for (i=1; i<=nr+1; i++)
l[i]=0;
while (l[nr+1]==0)
{
nrc=0;
pr=1;
for (i=1; i<=nr+1; i++)
{
if (l[i]==1)
l[i]=0;
else
{
l[i]=1;
break;
}
}
if (l[nr+1]==0)
{
for (i=1; i<=nr; i++)
{
if (l[i]==1)
{
pr=pr*di[i];
nrc++;
}
}
if (nrc%2==0)
s=s-a/pr;
else
s=s+a/pr;
}
}
sol=a-s;
if (sol>=p)
return 1;
else
return 0;
}
int main()
{
ciur[1]=1;
for (i=2; i<=1000000; i++)
{
if (ciur[i]==0)
{
v[++k]=i;
if (i<=10000)
{
for (j=i*i; j<=1000000; j=j+i)
ciur[j]=1;
}
}
}
fin>>n>>p;
s=0;
x=n;
nr=0;
for (d=1; d<=k&&v[d]*v[d]<=x; d++)
{
if (x%v[d]==0)
{
di[++nr]=v[d];
while (x%v[d]==0)
x=x/v[d];
}
}
if (x!=1)
di[++nr]=x;
st=1;
dr=(1ll<<61);
while (st<=dr)
{
mij=(st+dr)/2;
if (f (mij))
dr=mij-1;
else
st=mij+1;
}
fout<<st;
return 0;
}