Pagini recente » Cod sursa (job #1414643) | Cod sursa (job #284410) | Cod sursa (job #841211) | Cod sursa (job #2987988) | Cod sursa (job #1256899)
#include <fstream>
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
long long n, k, v[40], m;
int Max;
inline bool Check(long long Val){
long long cnt = 0;
for(int conf = 1;conf < Max; ++conf){
long long p = 1;
int nr = 0;
for(int i = 0;i < m; ++i)
if((conf&(1<<i))!=0){
++nr;
p = 1LL*p*v[i];
}
if(nr&1)
cnt += Val/p;
else
cnt -= Val/p;
}
cnt = Val-cnt;
return (cnt >= k);
}
inline void Desc(long long Val){
int k = 0;
long long p = 2;
while(Val%2==0){
Val /= 2;
++k;
}
if(k>0)
v[m++] = 2;
p = 3;
while(1LL*p*p <= Val){
int k = 0;
while(Val%p==0){
Val /= p;
++k;
}
if(k>0)
v[m++] = p;
p += 2;
}
if(Val > 1)
v[m++] = Val;
Max = 1<<m;
}
int main()
{
f >> n >> k;
f.close();
Desc(n);
long long L = 1,ret = -1,R = 1LL<<61;
while(L <= R){
long long Mid = (L+R)/2;
if(Check(Mid)){
ret = Mid;
R = Mid-1;
}
else
L = Mid+1;
}
g<<ret<<"\n";
g.close();
return 0;
}