#include<bits/stdc++.h>
using namespace std;  
#define ll long long
#define endl "\n"  
const double pi = acos(-1); 
#define pb  push_back
#define LL unsigned long long     
int  static dp[1005][1005];           
#define RADHE KRISHNA   
const int MOD = 1e9 + 7;
const int N = 1e6 + 2;
// int lcs(string s , string t , int  n , int m){
//   //base case
//   if(n == 0 || m == 0){
//     return 0;       
//   }
//   if(dp[n][m] != -1){   
//     return dp[n][m];         
//   }     
//   if(s[n-1] == t[m - 1]){
//     return (dp[n][m] = 1 + lcs(s , t , n - 1 , m - 1));
//   }
//   else{
//     return dp[n][m] = max(lcs(s ,t ,n-1 ,m) ,lcs(s ,t ,n ,m - 1) );
// }
// }  
// ll Pow(ll n, ll p, ll m) {
//   if(!p) return 1; 
//   else if(p & 1) return (n * Pow(n, p-1, m)) % m;
//   else {
//     ll v = Pow(n, p/2, m); 
//     return (v*v) % m;
//   }
// }   
 
// bool isprime(ll n){
//   if(n<2) return false;
//   for(ll i=2;i*i*i<=n;++i) if(n%i==0) return false;
//   for(int it=0;it<1e5;++it){
//     ll i = rand()%(n-1)+1;
//     if(__gcd(i,n)!=1) return false;
//     if(Pow(i,n-1,n)!=1) return false;
//   }           
//   return true;   
// }     
 
// void check(ll q){
//   vector<int>v;
//   for(int i = 2 ; i*i <= q; i++){
//     if(q % i == 0){
//       v.push_back(i);
//       if(i != q/i){
//         v.push_back(q/i);
//       }    
//     }    
//   }
//   for(auto x : v){
//     cout<<x<<" ";  
//   }
// }    
// set<int>s;    
// void SieveOfEratosthenes(ll n)
// { 
//     bool prime[n + 2];
//     memset(prime, true, sizeof(prime));
 
//     for (int p = 2; p * p <= n+1; p++)
//     {   
 
//         if (prime[p] == true)
//         {
     
//             for (ll i = p * p; i <= n+1; i += p)
//                 prime[i] = false;
//         }   
//     }
      
 
//     for (ll p = 2; p <= n+1; p++){
//         if (prime[p]){
//           s.insert(p);
//             }
// }     
// }   
// bool check(int x){   
//   int y = sqrt(x);
//   return y*y == x;
// } 
//ll fac[200002];
// bool rev(int i){
//   return (s[i] == t[s.size() - i - 1] && s[s.size() - i - 1] == t[i]);
// } 
//queue<pair<pair<int ,int>, int>>q;  
// bool valid(int x ,int y){
//   if(x > 0 && x <= n && y > 0 && y <= m){
//     return true;
//   }
//   else{
//     false;
//   }
// }
// bool checkk(int x ,int y){
//   return x >= 0 && x < n && y >= 0 && y < m;
// }
//vector<int>adj[200001];
//ll vis[200001];
//bool is_cycle;   
//ll min_cost;
//int dx1[] = {1,1,1,-1,-1,-1,0,0};
//int dy1[] = {1,0,-1, 1, 0, -1, 1, -1};  
//  int dx[4]={-1,0,0,1};            
//  int dy[4]={0,1,-1,0}; 

// char a[101][101];
// bool vis[101][101];
// int n ,m;
// bool valid(int x , int y){
//   if(x < 0 || x >= n || y < 0 || y >= m || a[x][y] == '.' || vis[x][y]==true){
//     return false;
//   }
//   else{
//     return true;
//   }
// }
// void dfs(ll x ,ll y){
//   vis[x][y] = true;    
//   for(int i = 0 ; i < 4; i++){   
//     int new_x = x + dx[i];
//     int new_y = y + dy[i];   
//     if(valid(new_x , new_y)){
//       dfs(new_x , new_y);
//     }
//   }
// }
int prime[N+1];
vector<int>v;
void seive(){
  memset(prime , true , sizeof(prime));
  prime[0] = false;
  prime[1] = false;
  for(int i = 2; i <= N; i++){
    if(prime[i]){
      v.push_back(i);
      for(int j = 2*i; j <= N; j += i){
        prime[j] = false;
      }
    }
  }
}
//int score[12] = {15 , 12 , 10 ,9 ,8, 7, 6, 5, 4, 3 ,2 ,1};
void solve(){  
// cin>>n>>m;           
//   cin>>ch;            
//   set<char>s;
//   int new_x , new_y;
//   char mat[n+1][m+1];
//   for(int i = 0 ; i < n ;i++){
//     for(int j = 0 ;j < m ;j++){
//       cin>>mat[i][j];
//     }
//   }   
//   for(int i = 0; i < n; i++){
//         for(int j = 0; j < m; j++) {   
//             if(mat[i][j] == ch){
//                 for(int k = 0; k < 4; k++){
//                     new_x = i + dx[k];
//                     new_y = j + dy[k];
//                     if(checkk(new_x,new_y) && mat[new_x][new_y] != '.' && mat[new_x][new_y] != ch){
//                         s.insert(mat[new_x][new_y]);
//                       }
//                 }
//             }
//     }
//   }     
//   cout<<s.size()<<endl;     
 // int a[4];
 // for(int i = 0 ; i < 4; i++){
 //  cin>>a[i];    
 // }          
 // sort(a, a+4);
 // if(a[0] + a[1] > a[2] || a[1]+a[2] > a[3]){
 //  cout<<"TRIANGLE"<<endl;
 // }
 // else if(a[0] + a[1] >= a[2] || a[1] + a[2] >= a[3]){
 //  cout<<"SEGMENT"<<endl;
 // }
 // else{  
 //  cout<<"IMPOSSIBLE"<<endl;
 // }  
// int n;
// cin>>n;    
// for(int i = 1; i <= n; i++){
//   vis[i] = 0;
// }
// for(int i = 1 ; i <= n ;i++){
//   cin>>a[i];
// }      
// for(int i = 1 ; i <= n ;i++){
//   cin>>b[i];
//   p[a[i]] = b[i];
// }
// int ans = 0;
// for(int i = 1; i <= n; i++){
//   // if(vis[i] || p[i] == i){
//   //   continue;
//   // }  
//   if(!vis[i]){    
//     ans++;   
//     int tmp = i;
//     while(!vis[tmp]){
//       vis[tmp] = 1;
//       tmp = p[tmp];
//     }
//   }                         
// }                 
// cout<<Pow(2 , ans , MOD)<<endl;  
// ll n ,m;
// cin>>n>>m;
// int ans = INT_MIN , num , cnt , tmp;
// for(int i = n ; i <= m ; i++){
//    tmp = i, cnt = 0;
//   while(tmp){   
//     if(tmp & 1){
//     cnt++;
// }
// tmp >>= 1ll;
//   }    
//   if(cnt > ans){
//     ans = cnt;  
//     num = i;
//   }
// }    
// cout<<num<<endl;
 ll a,b;
    cin>>a>>b;
    if(a==b){   
        cout<<0<<" "<<0<<endl;
    }
    else if(a<b){
        ll val=b-a;
        cout<<val<<" "<<min(a%val,val-a%val)<<endl;
    }
    else{
        ll val=a-b;
        cout<<val<<" "<<min(b%val,val-b%val)<<endl;
    }
}     
int main(){                                                    
                    
        ios_base::sync_with_stdio(false);     
       cin.tie(NULL);cout.tie(NULL);   
       int t  ;    
       cin>>t;            
    while(t--){        
      // int n ,m;    
      // cin>>n>>m;       
      //  string s ,t;
      // cin>>s>>t;    
      // memset(dp , -1 , sizeof(dp));   
      // cout<< n + m - lcs(s , t ,n ,m)<<endl;
  solve();
    }    
}