Pagini recente » Cod sursa (job #1190445) | Cod sursa (job #1220547) | Cod sursa (job #164929) | Cod sursa (job #1102876) | Cod sursa (job #1012382)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
bool ok[1000005];
int pr[80005],k=0,dv=0,ind;
long long a,b,d[1005];
void GenPrimes()
{ int i,j,vmax=1000000;
for(i=2;i<=vmax;i++)
{ if (!ok[i])
{k++; pr[k]=i;
for(j=i+i;j<=vmax;j+=i)
ok[j]=1;
}
}
}
void Desc(long long x)
{ int i;
dv=0;
for(i=1;i<=k && x>1;i++)
{if (x%pr[i]==0)
{ dv++; d[dv]=pr[i];
while(x%pr[i]==0) x/=pr[i];
}
if (1LL*pr[i]*pr[i]>1LL*x) break;
}
if (x>1) {dv++; d[dv]=1LL*x;}
}
long long Ans(long long lim)
{ int i,j,num=0;
long long mult=0,sol=0;
for(i=1;i<(1<<dv);i++)
{ num=0; mult=1;
for(j=0;j<dv;j++)
if (i&(1<<j)) {mult*=1LL*d[j+1]; num++;}
if (num%2==1) sol+=1LL*(lim/mult);
else sol-=1LL*(lim/mult);
}
return 1LL*(lim-sol);
}
void Search()
{ long long st=1,dr=(1LL<<61),mid=0;
while(st<dr)
{ mid=(st+dr)/2;
if (1LL*Ans(mid)>=1LL*ind) dr=1LL*mid; else st=1LL*(mid+1);
}
g<<st;
}
int main()
{ int t;
GenPrimes();
f>>b>>ind;
Desc(b);
Search();
return 0;
}