#include <bits/stdc++.h>
using namespace std ;

int read() {
	int f = 1 , j = 0 ; char c = getchar() ;
	while ( c < '0' || c > '9' ) { if ( c == '-' ) { f = -1 ; } c = getchar() ; }
	while ( c >= '0' && c <= '9' ) { j = ( j << 1 ) + ( j << 3 ) + ( c ^ 48 ) ; c = getchar() ; }
	return f * j ;
}

void write( int x , char y ) {
	int l = 0 ; char c[200] ;
	if ( x < 0 ) { putchar('-') ; x = -x ; }
	do { c[++l] = x % 10 + 48 ; x /= 10 ; } while (x) ;
	do { putchar(c[l--]) ; } while (l) ;
	putchar(y) ;
}

const int N = 1e3 + 10 ;
const int M = 5e2 ;
const int dx[7] = { 0 , -1 , 0 , 1 , 1 , 0 , -1 } ;
const int dy[7] = { 0 , 1 , 1 , 0 , -1 , -1 , 0 } ; 

struct Node {
	int x , y ;
} q[N * 1000] ;

int T , n , a , b , c , ans , cnt , ret , v[N][N] , col[N][N] ;

/*
void dfs( int x , int y , int res ) {
	if ( x < - 2 * a + 1 || x > 2 * a - 1 ) { return ; }
	if ( y < - 2 * b + 1 || y > 2 * b - 1 ) { return ; }
	if ( x + y < - 2 * c + 1 || x + y > 2 * c - 1 ) { return ; }
	ans = max( ans , res ) ;
	bool flg = 1 ;
	v[x + M][y + M] = 1 ;
	for ( int i = 1 ; i <= 6 ; i ++ ) {
		int ex = x + dx[i] , ey = y + dy[i] ;
		if ( col[ex + M][ey + M] == 1 ) { flg = 0 ; break ; }
	}
	for ( int i = 1 ; i <= 6 ; i ++ ) {
		int ex = x + dx[i] , ey = y + dy[i] ;
		if ( v[ex + M][ey + M] == 1 ) { continue ; }
		col[x + M][y + M] = 0 ; dfs( ex , ey , res ) ;
		if ( flg ) { col[x + M][y + M] = 1 ; dfs( ex , ey , res + 1 ) ; col[x + M][y + M] = 0 ; }
	}
	v[x + M][y + M] = 0 ;
}

void Dfs( int x , int y , int res ) {
	if ( x < - 2 * a + 1 || x > 2 * a - 1 ) { return ; }
	if ( y < - 2 * b + 1 || y > 2 * b - 1 ) { return ; }
	if ( x + y < - 2 * c + 1 || x + y > 2 * c - 1 ) { return ; }
	if ( res == ans ) { cnt ++ ; }
	bool flg = 1 ;
	v[x + M][y + M] = 1 ;
	for ( int i = 1 ; i <= 6 ; i ++ ) {
		int ex = x + dx[i] , ey = y + dy[i] ;
		if ( col[ex + M][ey + M] == 1 ) { flg = 0 ; break ; }
	}
	for ( int i = 1 ; i <= 6 ; i ++ ) {
		int ex = x + dx[i] , ey = y + dy[i] ;
		if ( v[ex + M][ey + M] == 1 ) { continue ; }
		col[x + M][y + M] = 0 ; Dfs( ex , ey , res ) ;
		if ( flg ) { col[x + M][y + M] = 1 ; Dfs( ex , ey , res + 1 ) ; col[x + M][y + M] = 0 ; }
	}
	v[x + M][y + M] = 0 ;
}
*/

void dfs( int dep , int res ) {
	if ( dep == cnt + 1 ) { ans = max( ans , res ) ; return ; }
	bool flg = 1 ; int x = q[dep].x , y = q[dep].y ;
	for ( int i = 1 ; i <= 6 ; i ++ ) {
		int ex = x + dx[i] , ey = y + dy[i] ;
		if ( col[ex + M][ey + M] == 1 ) { flg = 0 ; break ; }
	}
	col[x + M][y + M] = 0 ; dfs( dep + 1 , res ) ;
	if ( flg ) { col[x + M][y + M] = 1 ; dfs( dep + 1 , res + 1 ) ; col[x + M][y + M] = 0 ; }
}

void Dfs( int dep , int res ) {
	if ( dep == cnt + 1 ) { if ( ans == res ) { ret ++ ; } return ; }
	bool flg = 1 ; int x = q[dep].x , y = q[dep].y ;
	for ( int i = 1 ; i <= 6 ; i ++ ) {
		int ex = x + dx[i] , ey = y + dy[i] ;
		if ( col[ex + M][ey + M] == 1 ) { flg = 0 ; break ; }
	}
	col[x + M][y + M] = 0 ; Dfs( dep + 1 , res ) ;
	if ( flg ) { col[x + M][y + M] = 1 ; Dfs( dep + 1 , res + 1 ) ; col[x + M][y + M] = 0 ; }
}

signed main() {
	freopen( "geometry.in" , "r" , stdin ) ; freopen( "geometry.out" , "w" , stdout ) ;
	T = read() ;
	while ( T --> 0 ) {
		ans = cnt = ret = 0 ;
		a = read() , b = read() , c = read() ;
		for ( int x = -1000 ; x <= 1000 ; x ++ ) {
			for ( int y = -1000 ; y <= 1000 ; y ++ ) {
				if ( x < - 2 * a + 1 || x > 2 * a - 1 ) { continue ; }
				if ( y < - 2 * b + 1 || y > 2 * b - 1 ) { continue ; }
				if ( x + y < - 2 * c + 1 || x + y > 2 * c - 1 ) { continue ; }
				if ( x % 2 == 0 && y % 2 == 0 ) { continue ; }
				q[++cnt].x = x ; q[cnt].y = y ;
			}
		}
		dfs( 1 , 0 ) ; Dfs( 1 , 0 ) ;
		write( ans , ' ' ) ; write( ret , '\n' ) ;
	}
	return 0 ;
}
