#include <bits/stdc++.h>

using namespace std;

const int OO = 1e9;
const double EPS = 1e-9;

#define ndl cout << '\n'
#define sz(v) int(v.size())
#define pb push_back
#define mp make_pair
#define fs first
#define sc second
#define present(a, x) (a.find(x) != a.end())
#ifdef LOCAL
#define db(...) ({cout << "> Line " << __LINE__  \
		<< ": "; _db(#__VA_ARGS__, __VA_ARGS__);})
#else
#define db(...) true
#endif
template<class T>
void _db(const char *dbStr, T e) {
	cout << dbStr << " = " << e << endl;
}
template<class T, class... L>
void _db(const char *dbStr, T e, L... r) {
	while(*dbStr != ',') cout << *dbStr++;
	cout << " = " << e << ','; _db(dbStr + 1, r...);
}
template<class S, class T>
ostream& operator<<(ostream& o, const map<S, T>& v) {
	o << "["; int i = 0;
	for (const pair<S, T>& pr : v) o << (!i++ ? "" : ", ") << "{"
	                                 << pr.fs << " : " << pr.sc << "}"; return o << "]";
}
template<template <class, class...> class S, class T, class... L>
ostream& operator<<(ostream& o, const S<T, L...>& v) {
	o << "["; int i = 0;
	for (const auto& e : v) o << (!i++ ? "" : ", ") << e;
	return o << "]";
}
template<class S, class T>
ostream& operator<<(ostream& o, const pair<S, T>& pr) {
	return o << "(" << pr.fs << ", " << pr.sc << ")";
}
ostream& operator<<(ostream& o, const string& s) {
	for (const char& c : s) o << c; return o;
}
template<class T> using V = vector<T>;
template<class T> using VV = V<V<T>>;
template<class T> using VVV = VV<V<T>>;
using ll = long long;
using pii = pair<int, int>;
using vi = V<int>;
using vii = V<pii>;
using vvi = VV<int>;
using mii = map<int, int>;
using umii = unordered_map<int, int>;
using si = set<int>;
using usi = unordered_set<int>;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

const int MX = 2e5 + 5, MOD = 998244353;
int fact[MX], factInv[MX];

ll add(ll x, ll y) {
	x += y;
	while(x >= MOD)
		x -= MOD;
	while(x < 0)
		x += MOD;
	return x;
}

ll mul(ll x, ll y) {
	return (x * y) % MOD;
}

ll inv(ll a, ll b) {
	return 1 < a ? b - inv(b % a, a) * b / a : 1;
}

ll nCk(ll n, ll k) {
	if (k > n)
		return 0;
	ll ret = fact[n];
	return mul(ret, mul(factInv[k], factInv[n - k]));
}

int main() {
#ifdef LOCAL
	auto stTime = clock();
	freopen("../in.txt", "r", stdin);
//	freopen("../out.txt", "wb", stdout);
#endif
	ios::sync_with_stdio(false);
	cout.precision(10);
	cin.tie(0);

	fact[0] = 1, factInv[0] = inv(fact[0], MOD);

	for (int i = 1; i < MX; ++i) {
		fact[i] = mul(i, fact[i - 1]);
		factInv[i] = inv(fact[i], MOD);
	}

	int T;

	cin >> T;

	for (int tc = 1; tc <= T; ++tc) {
		int n;
		cin >> n;
		string s;
		cin >> s;
		if (n == 1) {
			cout << "1\n";
			continue;
		}
		int ones = 0, odds = 0;
		if (s.back() == '1' && s[n - 2] == '0')
			s.pop_back();
		if (s[0] == '1' && s[1] == '0')
			s = s.substr(1);
		n = sz(s);
		for (int i = 0; i < n; ++i) {
			if (s[i] == '1') {
				int len = 0;
				int j;
				for (j = i; j < n; ++j) {
					++len;
					if (j + 1 == n || s[j + 1] == '0') {
						break;
					}
				}
				i = j;
				ones += len;
				if (len & 1)
					++odds;
			}
		}
		db(s, ones, odds);
		int balls = (ones - odds) / 2, bins = (n - ones) + 1;
		cout << nCk(balls + bins - 1, bins - 1) << '\n';
	}


#ifdef LOCAL
	cout << "\n\n\nExecution time: " <<
	     (clock() - stTime) * 1e3 / CLOCKS_PER_SEC << " ms" << endl;
#endif
	return 0;
}
