//Har Har Mahadev
using namespace std;
#include <bits/stdc++.h>
#define booga cerr << "booga" << endl
#define int long long 
#define ld long double
#define pb push_back
#define mp make_pair
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#define safai(...) Clearing_out(__VA_ARGS__)
#define ll int

template <typename A, typename B>
	string to_string(pair<A, B> p);
 
template <typename A, typename B, typename C>
	string to_string(tuple<A, B, C> p);
 
template <typename A, typename B, typename C, typename D>
	string to_string(tuple<A, B, C, D> p);
 
string to_string(const string& s) {
	return '"' + s + '"';
}

string to_string(char c) {
	string s;
	s += c;
	return s;
}

string to_string(const char* s) {
	return to_string((string) s);
}
 
string to_string(bool b) {
	return (b ? "1" : "0");
}
 
string to_string(vector<bool> v) {
	bool first = true;
	string res = "{";
	for (int i = 0; i < static_cast<int>(v.size()); i++) {
	if (!first) {
		res += ", ";
	}
	first = false;
	res += to_string(v[i]);
	}
	res += "}";
	return res;
}
 
template <size_t N>
string to_string(bitset<N> v) {
	string res = "";
	for (size_t i = 0; i < N; i++) {
		res += static_cast<char>('0' + v[i]);
	}
	return res;
}
 
template <typename A>
string to_string(A v) {
	bool first = true;
	string res = "{";
	for (const auto &x : v) {
		if (!first) {
			res += ", ";
		}
		first = false;
		res += to_string(x);
	}
	res += "}";
	return res;
}
 
template <typename A, typename B>
string to_string(pair<A, B> p) {
	return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
 
template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p) {
	return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ")";
}
 
template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p) {
	return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")";
}
 
void debug_out() { cerr << endl; }
 
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
	cerr << " " << to_string(H);
	debug_out(T...);
}

void Clearing_out() { return; }

template <typename Head, typename... Tail>
void Clearing_out(Head &H, Tail & ... T) {
	H.clear();
	Clearing_out(T...);
}
const int MXN = 1e6 + 5;
const ll mod = 998244353 ;
ll fac[MXN],invfac[MXN];
ll power(ll x, ll y){
	ll res = 1;
	x = x % mod;
	if (x == 0) return 0;
	while (y > 0){
		if (y & 1)
			res = (res*x) % mod;
		y = y >> 1;
		x = (x*x) % mod;
	}
	return res;
}
void prep(){ // Don't forget to call this
	fac[0] = 1;
	for(int i = 1; i < MXN; i++){
		fac[i] = fac[i-1]*i;
		fac[i] %= mod;
	}
	invfac[MXN-1] = power(fac[MXN-1],mod-2);
	for(int i = MXN-2; i >= 0; i--){
		invfac[i] = invfac[i+1]*(i+1);
		invfac[i] %= mod;
	}
}
ll C(int n,int r){
	if(n < r)return 0;
	return ((fac[n]*invfac[r])%mod * invfac[n-r])%mod;
}

void testcase(){
	int n;
	cin >> n;
	string s;
	
	cin >> s;
	vector<int> visited(n, 0);
	int n11(0);
	for(int i = 0; i < n; i++){
		//debug(i + 1 < n , !visited[i] , s[i]==1 , s[i+1] == 1);
		if(i + 1 < n && !visited[i] && s[i]=='1' && s[i+1] == '1'){
			visited[i] = 1;
			visited[i+1] = 1;
			n11++;
		}
	}
	int rem = n - 2*n11;
	//debug(n11);
	for(int i = 0; i < n; i++){
		if(s[i]=='1' && !visited[i]) rem--;
	}
	//debug(rem+n11, rem);
	cout << C(rem+n11, rem) << '\n';
}


int32_t main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	prep();
	int tt = 1;
	
	cin >> tt;
	while(tt--){
		testcase();
	}
	return 0;
}
