#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
namespace func{
	typedef long long ll;
	constexpr int mod=998244353;
	void modp(int&x){
		x>=mod&&(x-=mod);
	}
	void modn(int&x){
		x<0&&(x+=mod);
	}
	ll quickpow(ll x,int k,ll ret=1){
		for(; k; k>>=1,x=x*x%mod)
			(k&1)&&(ret=ret*x%mod);
		return ret;
	}
	template<typename T>void readuint(T&x){
		char ch;
		while((ch=getchar())<'0');
		for(x=ch^'0'; (ch=getchar())>='0'; x=x*10+(ch^'0'));
	}
	void writeuint(int x){
		char str[10];
		char*const ed=str+9;
		char*now=ed;
		for(; x>=10; x/=10,--now)
			*now=(x%10)|'0';
		*now=x|'0';
		for(; now<=ed; ++now)
			putchar(*now);
	}
	template<typename T>void writelnuint(const T&x){
		writeuint(x);
		putchar('\n');
	}
	int popcnt(const int&x){
		return __builtin_popcount(x);
	}
}
namespace program{
	using namespace func;
	typedef long long ll;
	constexpr int max_a=10;
	constexpr int max_stat=1<<(max_a*2);
	ll f[max_stat],f1[max_stat];
	int g[max_stat],g1[max_stat];
	void test(){
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		if(a>b)
			swap(a,b);
		if(b>c)
			swap(b,c);
		if(a>b)
			swap(a,b);
		if(a>max_a)
			return;
		if(a+b<c)
			c=a+b;
		const int n=a*2;
		memset(f,128,sizeof(f));
		memset(g,0,sizeof(g));
		f[0]=0,g[0]=1;
		if(a+b!=c){
			for(int now=a+b-c-1; now>=0; --now){
				const int stp=1<<now;
				for(int i=1<<n; (i-=stp)>=0; ){
					ll ans=0;
					int cnt=0;
					for(int j=1<<n; (j-=stp*2)>=0; ){
						ll t=popcnt(i)+f[j];
						int dp[2]={0,-2},dpc[2]={1,0};
						for(int k=now+1; k<n; ++k){
							int tdp[2],tdpc[2];
							if((i&(1<<(k-1)))||(j&(1<<k)))
								tdp[1]=-2,tdpc[1]=0;
							else
								tdp[1]=dp[0]+1,tdpc[1]=dpc[0];
							if(dp[0]>dp[1])
								tdp[0]=dp[0],tdpc[0]=dpc[0];
							else
								if(dp[0]<dp[1])
									tdp[0]=dp[1],tdpc[0]=dpc[1];
								else
									tdp[0]=dp[0],modp(tdpc[0]=dpc[0]+dpc[1]);
//							printf("%d(%d) %d(%d)\n",tdp[0],tdpc[0],tdp[1],tdpc[1]);
							if((i&(1<<k))||(j&(1<<k)))
								dp[1]=-2,dpc[1]=0;
							else
								dp[1]=tdp[0]+1,dpc[1]=tdpc[0];
							if(tdp[0]>tdp[1])
								dp[0]=tdp[0],dpc[0]=tdpc[0];
							else
								if(tdp[0]<tdp[1])
									dp[0]=tdp[1],dpc[0]=tdpc[1];
								else
									dp[0]=tdp[0],modp(dpc[0]=tdpc[0]+tdpc[1]);
//							printf("%d(%d) %d(%d)\n",dp[0],dpc[0],dp[1],dpc[1]);
						}
						if(dp[1]>dp[0])
							dp[0]=dp[1],dpc[0]=dpc[1];
						else
							if(dp[1]==dp[0])
								modp(dpc[0]+=dpc[1]);
//						printf("(%d->%d): %d %d\n",j,i,dp[0],dpc[0]);
						t+=dp[0];
						const int tc=ll(dpc[0])*g[j]%mod;
//						printf(" (%lld %d)\n",t,tc);
						if(t>ans)
							ans=t,cnt=tc;
						else
							if(t==ans)
								modp(cnt+=tc);
					}
					f1[i]=ans,g1[i]=cnt;
				}
				memcpy(f,f1,sizeof(f));
				memcpy(g,g1,sizeof(g));
			}
		}
//		for(int i=1<<n; --i>=0; )
//			printf("%d: %lld %d\n",i,f[i],g[i]);
		for(int now=c-a; now; --now){
			for(int i=1<<n; --i>=0; ){
				ll ans=0;
				int cnt=0;
				for(int j=1<<n; --j>=0; ){
					ll t=popcnt(i)+f[j];
					int dp[2]={0,1},dpc[2]={1,1};
					if((i&1)||(j&1))
						dp[1]=-2,dpc[1]=0;
					for(int k=1; k<n; ++k){
						int tdp[2],tdpc[2];
						if((i&(1<<(k-1)))||(j&(1<<k)))
							tdp[1]=-2,tdpc[1]=0;
						else
							tdp[1]=dp[0]+1,tdpc[1]=dpc[0];
						if(dp[0]>dp[1])
							tdp[0]=dp[0],tdpc[0]=dpc[0];
						else
							if(dp[0]<dp[1])
								tdp[0]=dp[1],tdpc[0]=dpc[1];
							else
								tdp[0]=dp[0],modp(tdpc[0]=dpc[0]+dpc[1]);
						if((i&(1<<k))||(j&(1<<k)))
							dp[1]=-2,dpc[1]=0;
						else
							dp[1]=tdp[0]+1,dpc[1]=tdpc[0];
						if(tdp[0]>tdp[1])
							dp[0]=tdp[0],dpc[0]=tdpc[0];
						else
							if(tdp[0]<tdp[1])
								dp[0]=tdp[1],dpc[0]=tdpc[1];
							else
								dp[0]=tdp[0],modp(dpc[0]=tdpc[0]+tdpc[1]);
					}
					if(dp[1]>dp[0])
						dp[0]=dp[1],dpc[0]=dpc[1];
					else
						if(dp[1]==dp[0])
							modp(dpc[0]+=dpc[1]);
					t+=dp[0];
					const int tc=ll(dpc[0])*g[j]%mod;
					if(t>ans)
						ans=t,cnt=tc;
					else
						if(t==ans)
							modp(cnt+=tc);
				}
				f1[i]=ans,g1[i]=cnt;
			}
			memcpy(f,f1,sizeof(f));
			memcpy(g,g1,sizeof(g));
		}
//		for(int i=1<<n; --i>=0; )
//			printf("%d: %lld %d\n",i,f[i],g[i]);
		ll ans=0;
		int cnt=0;
		for(int i=1<<n; --i>=0; ){
			int r=0;
			for(int x=i,t=n; t; x/=2,--t)
				r=r*2|(x&1);
			ll t=f[i]+f[r]-popcnt(i);
			int tc=ll(g[i])*g[r]%mod;
			if(t>ans)
				ans=t,cnt=tc;
			else
				if(t==ans)
					modp(cnt+=tc);
		}
		printf("%lld %d\n",ans,cnt);
	}
	void main(){
		int t;
		for(scanf("%d",&t); t; test(),--t);
	}
}
int main(){
	freopen("geometry.in","r",stdin);
	freopen("geometry.out","w",stdout);
	program::main();
	return 0;
}
