Pagini recente » Cod sursa (job #531378) | Cod sursa (job #28057) | Cod sursa (job #2705382) | Cod sursa (job #2850790) | Cod sursa (job #2871872)
#include <fstream>
#include <bitset>
using namespace std;
long long D[60],sir[1000000];
bitset <10000005> ciur;
long long n,p,st=1,dr=1000000000000000000LL,retin;
long long d=1,ok=0,cnt=0,cn;
long long raspuns(long long a,long long b)
{
long long rez=0;
for(int i=0;i<(1<<cnt);i++)
{
long long p=1,nr=0;
for(int j=0;j<cnt;j++)
{
if(i&(1<<j))
{
nr++;
p*=D[j];
}
}
if(nr%2==0)
rez+=a/p;
else
rez-=a/p;
}
return rez;
}
int main()
{
int cate=0;
ifstream cin("frac.in");
ofstream cout("frac.out");
for(int i=3;i*i<=10000000;i+=2)
if(ciur[i]==0)
{
for(int j=i*i;j<=10000000;j+=i)
ciur[j]=1;
}
sir[++cate]=2;
for(int i=3;i<=10000000;i+=2)
for(int j=ciur[i];j<1;j++)
sir[++cate]=i;
cin>>n>>p;
cn=n;
while(sir[d]*sir[d]<=cn)
{
while(cn%sir[d]==0)
{
cn/=sir[d];
ok=1;
}
if(ok==1)
D[cnt++]=sir[d];
ok=0;
d++;
}
if(cn>1)
D[cnt++]=cn;
while(st<=dr)
{
long long mij=(st+dr)/2;
if(raspuns(mij,n) >= p)
{
retin = mij;
dr=mij-1;
}
else
st=mij+1;
}
cout<<retin;
return 0;
}