#![allow(dead_code, unused_imports, unused_macros, non_snake_case)] fn main() { input! { N: usize, A: Chars, } let mut rle = vec![('_', 0)]; for i in 0 .. N { let last = rle.last_mut().unwrap(); if A[i] == last.0 { last.1 += 1; } else { rle.push((A[i], 1)); } } rle.remove(0); if let Some(&('1', _)) = rle.first() { rle.remove(0); } if let Some(&('0', _)) = rle.last() { rle.pop(); } let mut ans = 1; for i in 0 .. rle.len() / 2 { let a = rle[i * 2].1 as i64; let b = rle[i * 2 + 1].1 as i64; ans *= (a + b + 1) % MOD; ans = ans.rem_euclid(MOD); } println!("{ans}"); } const MOD: i64 = 998244353; use proconio::{input, input_interactive, marker::{Chars, Bytes, Usize1}}; fn mod_pow(mut a: i64, mut b: i64) -> i64 { let mut r = 1; while b > 0 { if b & 1 != 0 { r = r * a % MOD; } a = a * a % MOD; b >>= 1; } r }