Pagini recente » Borderou de evaluare (job #186502) | Cod sursa (job #2119402) | Cod sursa (job #952243) | Cod sursa (job #2399808) | Cod sursa (job #470509)
Cod sursa(job #470509)
#include <cstdio>
#include <algorithm>
using namespace std;
#define file_in "frac.in"
#define file_out "frac.out"
long long n,p;
int q[1000],nr;
void citire()
{
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%lld %lld", &n, &p);
}
long long verif(long long x)
{
int i,j;
long long sol=0;
long long prod;
for (i=1;i<(1<<nr);++i)
{
nr=0;
prod=1;
for (j=1;j<=nr;++j)
if (i&(1<<(j-1)))
{
nr++;
prod*=q[j];
}
if (nr&1)
sol+=x/prod;
else
sol-=x/prod;
}
return sol;
}
void solve()
{
int j;
long long i,ls,ld,mij,sol;
for (i=2;i*i<n;++i)
if (n%i==0)
{
q[++nr]=n/i;
q[++nr]=i;
}
if (i*i==n)
q[++nr]=n;
sort(q+1,q+nr+1);
ls=0;
ld=1LL<<62;
while(ls<=ld)
{
mij=(ls+ld)>>1;
if (verif(mij)>=p)
{
sol=mij;
ld=mij-1;
}
else
ls=mij+1;
}
printf("%lld\n", sol);
}
int main()
{
citire();
solve();
fclose(stdin);
fclose(stdout);
return 0;
}