#include <bits/stdc++.h>
using namespace std;
vector <int> vec(100000020);
vector <int> prime;
void sieve()
{
    vec[0]=1;
    vec[1]=1;
    for(int i=2;i<=sqrt(100000020);i++){
        if(vec[i]==0){
            prime.push_back(i);
            for(int j=2;j*i<=100000020;j++){
                vec[j*i]=1;
            }
        }
    }
}
int main()
{
    int t;
    cin >> t;
    sieve();
    for(int i=1;i<=t;i++){
        int l,u,pos2,pos1;
        cin >> l >> u;
        vector <int> ::iterator it1;
        vector <int> ::iterator it2;
        it1=lower_bound(prime.begin(),prime.end(),l);
        it2=lower_bound(prime.begin(),prime.end(),u);
        if(u==0 || u==1){
            pos2=0;
        }
        else if(*it2!=u){
            pos2=it2-prime.begin()-1;
        }
        else{
            pos2=it2-prime.begin()+1;
        }
        if(l==0 || l==1){
            pos1=0;
        }
        else if(*it1!=l){
            pos1=it1-prime.begin()-1;
        }
        else{
            pos1=it1-prime.begin();
        }
        cout << pos2 << "  " << pos1 << endl;
    }
}