#include<bits/stdc++.h>
#define pb push_back
using namespace std;
inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(!isdigit(c)){
		if(c=='-') f=~f+1;c=getchar();
	}
	while(isdigit(c)){
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	return f==-1?~x+1:x;
}
const int mod=998244353;
int add(int x,int y){
	return x+y>=mod?x+y-mod:x+y;
}
int T,a,b,c;
inline void addx(int &x,int y){
	(x+=y)>=mod?x-=mod:x;
}
struct node{
	int mx,f;
	inline void trans(const node &x){
		if(x.f&&x.mx>mx) mx=x.mx,f=x.f;
		else if(x.mx==mx) addx(f,x.f);
	}
} dp[2][1<<15],zro;
node mer(node x,node y){
	if(x.mx>y.mx) return x;
	else if(x.mx<y.mx) return y;
	else return node{x.mx,add(x.f,y.f)};
}
int lst[2][1<<15];
int sz[2];
bool used[1<<15];
int main(){
	freopen("geometry.in","r",stdin);
	freopen("geometry.out","w",stdout);
	T=read();
	while(T--){
		a=read(),b=read(),c=read();
		int La=-2*a+1,Ra=2*a-1;
		bool fl=0;fill(dp[fl],dp[fl]+(1<<Ra-La+1),zro);fill(dp[fl^1],dp[fl^1]+(1<<Ra-La+1),zro);
		dp[fl][0]=node{0,1};int len=0;
		node ans=node{0,0};lst[0][1]=0;sz[0]=1;
		for(int y=-2*b+1;y<=2*b-1;++y){
			for(int x=La;x<=Ra;++x){
				fl^=1;
				sz[fl]=0;
				int st;node bf;
				int cnt=0,bq,qu;
				bool f=(x+y<-2*c+1);
				f|=(x+y>2*c-1);
				f|=(x%2==0&&y%2==0);x-=La;
				for(int i=1;i<=sz[fl^1];++i){
					st=lst[fl^1][i];bf=dp[fl^1][st];dp[fl^1][st]=zro;
					++cnt;
					bq=st&(~(1<<x));
					dp[fl][bq].trans(bf);
					if(!used[bq]) used[bq]=1,lst[fl][++sz[fl]]=bq;
					if(f) continue ;
					if((!x||~st>>(x-1)&1)&&(~st>>x&1)&&(~st>>(x+1)&1)){
						qu=st|(1<<x);
						++bf.mx;dp[fl][qu].trans(bf);
						if(!used[qu]) used[qu]=1,lst[fl][++sz[fl]]=qu;
					}
				}
				x+=La;
				for(int j=1;j<=sz[fl];++j) used[lst[fl][j]]=0;
			}
		}
		for(int i=1;i<=sz[fl];++i){
			ans.trans(dp[fl][lst[fl][i]]);
		}
//		cerr<<114514<<'\n';
		printf("%d %d\n",ans.mx,ans.f);
	}
}