#include #include typedef long long ll; typedef long double lb; using namespace std; using namespace atcoder; #define all(x) (x).begin(), (x).end() #define OVERLOAD_REP(_1, _2, _3, name, ...) name #define REP1(i, n) for (auto i = std::decay_t{}; (i) != (n); ++(i)) #define REP2(i, l, r) for (auto i = (l); (i) != (r); ++(i)) #define rep(...) OVERLOAD_REP(__VA_ARGS__, REP2, REP1)(__VA_ARGS__) template bool chmin(T& a, const T& b){if(a > b){a = b; return 1;} return 0;} template bool chmax(T& a, const T& b){if(a < b){a = b; return 1;} return 0;} const ll INF = 1000000000000000000; // 10^18 const ll mod = 998244353; int main(){ ll n; string a; cin >> n >> a; vector v; for (int l = 0; l < n;) { int r = l + 1; for (; r < n && a[l] == a[r]; r++) {}; v.push_back(r-l); l = r; } ll ans = 1; if(a[0] == '0' && a[a.size()-1] == '1'){ for(ll i = 0;i < v.size();i+=2){ ll tmp = 0; tmp = (v[i] + v[i+1] + 1) % mod; ans *= tmp; ans %= mod; } }else if(a[0] == '0' && a[a.size()-1] == '0'){ for(ll i = 0;i < v.size()-1;i+=2){ ll tmp = 0; tmp = (v[i] + v[i+1] + 1) % mod; ans *= tmp; ans %= mod; } }else if(a[0] == '1' && a[a.size()-1] == '1'){ for(ll i = 1;i < v.size()-1;i+=2){ ll tmp = 0; tmp = (v[i] + v[i+1] + 1) % mod; ans *= tmp; ans %= mod; } }else if(a[0] == '1' && a[a.size()-1] == '0'){ for(ll i = 1;i < v.size()-2;i+=2){ ll tmp = 0; tmp = (v[i] + v[i+1] + 1) % mod; ans *= tmp; ans %= mod; } } cout << ans << endl; return 0; }