#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/rope>
using namespace __gnu_cxx;
using namespace std;
using namespace __gnu_pbds;
using ll = long long;
typedef tree<pair<ll,ll>, null_type, less<pair<ll,ll>>, rb_tree_tag, tree_order_statistics_node_update> yam; // find_by_order, order_of_key
using namespace std;
#define moe             \
ios::sync_with_stdio(0); \
cin.tie(0);              \
cout.tie(0);             \
cout << setiosflags(ios::fixed) << setprecision(9);
#define all(a) (a).begin(), (a).end()
#define allr(a) (a).rbegin(), (a).rend()
#define pb push_back
#define f(i, n, m) for (ll i = (n); i < (ll)(m); i++)
#define rf(i, n, m) for (ll i = (ll)(m) - 1; i >= (ll)(n); i--)
#define no cout << "NO" << "\n";
#define yes cout << "YES" << "\n";
const ll MOD = 1e9 + 7;
#define vll vector<ll>
#define vpll vector<pair<ll, ll>>
const ll sup = 1e18;
const ll inf = -1e18;
#define bob cout << "BOB" << "\n";
#define alice  cout << "ALICE" << "\n";
map < ll  , ll > mp ;

vector<ll> sieve(ll n) {
    vector<ll> primes(n + 1, 1);
    primes[0] = primes[1] = 0;
    mp[0] = 1 ; mp[1] = 1 ;
    for (ll i = 2; i * i <= n; i++) {
        if (primes[i]) {
            mp[i] = 1 ;
            for (ll j = i * i; j <= n; j += i) {
                primes[j] = 0;
                mp[j]++;
            }
        }
    }
    vector<ll> prime_numbers;
    for (ll i = 2; i <= n; i++) {
        if (primes[i]) prime_numbers.pb(i);
    }
    return prime_numbers;
}
void solve() {



}

/*struct DSU {
    vll p, sz;
    ll max_comp;
    DSU(ll n) {
        p.resize(n);
        sz.assign(n, 1);
        max_comp = 1;
        f(i, 0, n) p[i] = i;
    }
    ll ufind(ll x) { return (p[x] == x) ? x : (p[x] = ufind(p[x])); }
    bool unite(ll x, ll y) {
        x = ufind(x), y = ufind(y);
        if (x == y) return false;
        if (sz[x] < sz[y]) swap(x, y);
        p[y] = x;
        sz[x] += sz[y];
        max_comp = max(max_comp, sz[x]);
        return true;
    }
};*/

signed main() {
    moe;
    vector<int> my_table(1e6+1,0);
    map<int,vector<int>> scores;
    scores[0]={0,1};
    for (int i=2;i<=1e6;i++) {
        if (my_table[i]==0) {
            my_table[i]=1;
            for (int j=i*2;j<=1e6;j+=i) {
                my_table[j]++;
            }
        }
        scores[my_table[i]].push_back(i);
    }
    int p=1;
    while (p<10e6) {
        p*=2;
    }
    vector<int> arr(p*2,0);
    for (int i=0;i<1e6+1;i++) {
        arr[i+p]=my_table[i];
    }
    for (int i=p-1;i>0;i--) {
        arr[i]=max(arr[i*2],arr [i*2+1]);
    }



    ll hoh = 1;
    cin >> hoh;

    while (hoh--) {
        /*ll n,m;cin>>n>>m;ll ct=0;
        vector<vector<char>>g(n,vector<char>(m));
        f(i,0,n)f(j,0,m) {
            cin>>g[i][j];
            if (g[i][j]=='*')ct++;
        }
        DSU dsu(n*m);
        f(i,0,n) {
            f(j,0,m) {
                if (g[i][j]!='.')continue;
                if (i-1>=0) {
                    ll nwi=i-1;
                    if (g[nwi][j]=='.')dsu.unite(nwi*m+j,i*m+j);
                }
                if (i+1<=n-1) {
                    ll nwi=i+1;
                    if (g[nwi][j]=='.')dsu.unite(nwi*m+j,i*m+j);
                }
                if (j-1>=0) {
                    ll nwj=j-1;
                    if (g[i][nwj]=='.')dsu.unite(i*m+nwj,i*m+j);
                }
                if (j+1<=m-1) {
                    ll nwj=j+1;
                    if (g[i][nwj]=='.')dsu.unite(i*m+nwj,i*m+j);
                }
            }
        }
        vll ans(ct);
        ll curr=0;
        f(i,0,n) {
            f(j,0,n) {
                if (g[i][j]=='*') {
                    if (i-1>=0) {
                        ll nwi=i-1;
                        dsu.unite(nwi*m+j,i*m+j);
                    }
                    if (i+1<=n-1) {
                        ll nwi=i+1;
                        dsu.unite(nwi*m+j,i*m+j);
                    }
                    if (j-1>=0) {
                        ll nwj=j-1;
                        dsu.unite(i*m+nwj,i*m+j);
                    }
                    if (j+1<=m-1) {
                        ll nwj=j+1;
                        dsu.unite(i*m+nwj,i*m+j);
                    }
                }
                ll rec=dsu.ufind(m*i+j);
                cout<<dsu.sz(rec)<<endl;
            }
        }
        */
        int l,r;
        cin>>l>>r;
        if (r==1) {
            cout<<1<<" "<<1<<endl;
            continue;
        }

        int l1=l,r1=r;
        l+=p;
        r+=p;
        int maxi=0;
        while (r>=l && r>0) {
            if (l%2==1)maxi=max(maxi,arr[l++]);
            if (r%2==0)maxi=max(maxi,arr[r--]);
            l/=2;
            r/=2;

        }
        auto it =  lower_bound(all(scores[maxi]) , l1  ) ;
        int counter = *it ;

      /*  int counter=scores[maxi].size()-1;
        for (int i=scores[maxi].size()/2;i>0;i/=2) {
            while (counter-i>=0 &&scores[maxi][counter-i]>=l1)counter-=i;
        }*/
        ll answer=counter;
        /*auto it  = upper_bound(all(scores[maxi]) , r) ;
        ll ans = 0 ;
        if (it == scores[maxi].end() ) {
            ans = *scores[maxi].rbegin() ;
        }
        else {
            it = prev(it) ;
            ans = *it ;
        }*/
        //cout<<maxi<<endl;
        ll res=(1ll<<(maxi-1));
        cout <<answer<<" "<<res<<endl;



    }

    return 0;
}


