#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;   }