#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i)) #define rer(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i)) #define reu(i,l,u) for(int (i)=(int)(l);(i)<(int)(u);++(i)) #if defined(_MSC_VER) || __cplusplus > 199711L #define aut(r,v) auto r = (v) #else #define aut(r,v) __typeof(v) r = (v) #endif #define each(it,o) for(aut(it, (o).begin()); it != (o).end(); ++ it) #define all(o) (o).begin(), (o).end() #define pb(x) push_back(x) #define mp(x,y) make_pair((x),(y)) #define mset(m,v) memset(m,v,sizeof(m)) #define INF 0x3f3f3f3f #define INFL 0x3f3f3f3f3f3f3f3fLL using namespace std; typedef vector vi; typedef pair pii; typedef vector > vpii; typedef long long ll; template inline void amin(T &x, U y) { if(y < x) x = y; } template inline void amax(T &x, U y) { if(x < y) x = y; } vector isprime; vector primes; void sieve(int n) { if((int)isprime.size() >= n + 1) return; isprime.assign(n + 1, true); isprime[0] = isprime[1] = false; int sqrtn = (int)(sqrt(n * 1.) + .5); for(int i = 2; i <= sqrtn; i ++) if(isprime[i]) { for(int j = i * i; j <= n; j += i) isprime[j] = false; } primes.clear(); for(int i = 2; i <= n; i ++) if(isprime[i]) primes.push_back(i); } int main() { sieve(1100000); long long L; long long R; while(~scanf("%lld%lld", &L, &R)) { pair ans(-1, -1LL); //答えが小さい数になる場合はたとえ素因数が2つでもここではカバーされない //どれくらい大きければいいんだろうか? for(int p : primes) { if((ll)p * p > R) break; int q = *(upper_bound(primes.begin(), primes.end(), R / p) - 1); if(p <= q && L <= (ll)p * q) amax(ans, mp(p, (ll)p * q)); } //(prime gap)^2 とかそんな感じ? //あと R^(1/3) くらいは必要そう if(R - L <= 1100000) { vector minp((int)(R - L + 1), -1); for(int p : primes) { if((ll)p * p > R) break; for(ll t = (L + p - 1) / p * p; t <= R; t += p) { int i = (int)(t - L); if(minp[i] == -1) minp[i] = p; } } rep(i, minp.size()) { int p = minp[i]; if(p != -1) amax(ans, mp(p, (ll)L + i)); } } printf("%lld\n", ans.second); } return 0; }