/*
	Codeforces Round #732 (Div. 2)
	
	看的题解-》https://www.cnblogs.com/Wajor/p/15020030.html 
	
	组合数+逆元
	
	2021.07.19
	BY FTTS 
*/ 
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
const ll mod=998244353;

char a[maxn];

ll fact[maxn],ifact[maxn];//阶乘，阶乘对应的逆元
ll Inv[maxn];

ll inv(ll a){
	if(a==1)	return 1;
	return Inv[a]?Inv[a]:Inv[a]=(mod-mod/a)*inv(mod%a)%mod;
}

void init(){
	fact[0]=ifact[0]=1;
	for(int i=1;i<maxn;i++){
		fact[i]=fact[i-1]*i%mod;
		ifact[i]=ifact[i-1]*inv(i)%mod;
	}
}


int main(){
	init();
	int t;
	cin>>t;
	while(t--){
		int n;
		ll num_0=0;
		ll num_11=0;
		scanf("%d",&n);
		getchar();
		for(int i=1;i<=n;i++){
			scanf("%c",a+i);
			if(a[i]=='0')	num_0++;	
		}
		for(int i=1;i<=n;i++){
			if(a[i]=='1'&&a[i+1]=='1')	num_11++,i++;
		}
		printf("%lld\n",((fact[num_11+num_0]*ifact[num_11])%mod)*ifact[num_0]%mod);
	}
	return 0;
}
/*
6
4
0110
6
011011
5
01010
20
10001111110110111000
20
00110110100110111101
20
11101111011000100010
*/