//Maqsad Nahi Bhoolna #include #include #include using namespace std; using namespace __gnu_pbds; template using min_heap = priority_queue, greater>; template using max_heap = priority_queue; template using ordered_set = tree, rb_tree_tag, tree_order_statistics_node_update>; //find_by_order(k): returns iterator to k-th smallest element (0-based) //order_of_key(x): returns number of elements strictly less than x #define ll long long int #define ld long double #define nl cout<<"\n" #define re return 0 #define fs first #define sc second #define MOD 1000000007 #define pii pair #define vl vector #define vll vector> #define vpii vector> #define vvpii vector>> #define vb vector #define vbb vector> #define us unordered_set #define all(vec) vec.begin(), vec.end() #define allr(vec) vec.rbegin(), vec.rend() #define sahi(vec) sort(vec.begin(),vec.end()) #define ulta(vec) sort(vec.begin(),vec.end(),greater()) #define fori(a,b) for(ll i=a;i=b;r--) #define yes(expr) (expr)? cout<<"yes" : cout<<"no" #define Yes(expr) (expr)? cout<<"Yes" : cout<<"No" #define YES(expr) (expr)? cout<<"YES" : cout<<"NO" #define print(vec) for(auto x : vec) cout< istream& operator>>(istream &in, pair &p) { in >> p.first >> p.second; return in; } template istream& operator>>(istream &in, vector &v) { for (auto &x : v) in >> x; return in; } template istream& operator>>(istream &in, vector> &vp) { for (auto &p : vp) in >> p.first >> p.second; return in; } template ostream& operator<<(ostream &out, const pair &p) { out << p.first << " " << p.second; return out; } template ostream& operator<<(ostream &out, const vector &v) { for (auto &x : v) out << x << " "; return out; } template ostream& operator<<(ostream &out, const vector> &vp) { for (auto &p : vp) out << p.first << " " << p.second << "\n"; return out; } vb is_prime; void sieve(ll n) { is_prime.assign(n+1,true); is_prime[0] = is_prime[1] = false; for(ll i=2;i*i<=n;i++) { if(is_prime[i]) { for(ll j=i*i;j<=n;j+=i) is_prime[j] = false; } } } int main() { io; ll t = 1; cin>>t; sieve(1e6); vl spf; fori(0,1e6) if(is_prime[i]) spf.push_back(i); while(t--) { ll n, k; cin >> n >> k; bool flag = true; forr(n,max(n-10000,k+1)) { ll y = r, maxi = 0, sm = 0; vl ax; for(auto x : spf) { while(y % x == 0) { ax.push_back(x); maxi = max(x,maxi); if(sm == 0) sm = x; y /= x; } if(y==1) break; } if(y>1) { ax.push_back(y); maxi = max(maxi,y); } ll ma = 1; fori(0,((ax.size()+1)/2)) { ma *= ax[i]; } if(maxi > k || (n / ma > k) || (ma > k)) { cout << r; flag = false; break; } } if(flag) cout << -1; nl; } return 0; }