Pagini recente » Cod sursa (job #267790) | Cod sursa (job #1006977) | Cod sursa (job #1161019) | Cod sursa (job #2961551) | Cod sursa (job #1256885)
#include <fstream>
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
long long n, k, v[40];
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 < v[0]; ++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;
int p = 2;
while(Val%2==0){
Val /= 2;
++k;
}
if(k)
v[v[0]++] = 2;
p = 3;
while(1LL*p*p <= Val){
int k = 0;
while(Val%p==0){
Val /= p;
++k;
}
if(k>0)
v[v[0]++] = p;
p += 2;
}
if(Val > 1)
v[v[0]++] = Val;
Max = 1<<v[0];
}
int main()
{
f >> n >> k;
f.close();
Desc(n);
long long L = 1,ret = -1,R = 1LL<<62;
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;
}