import sys def solve(): # 入力を一気に読み込む s = sys.stdin.read().strip() if not s: return # 文字列の長さ N # 文字列 A が s として与えられている n = len(s) a = s MOD = 998244353 # 1. 最初に出現する '0' と、最後に出現する '1' を探す # (これより外側は変化できない) first_zero = a.find('0') last_one = a.rfind('1') # '0' がない、'1' がない、または '0' がすべて '1' より後ろにある場合 if first_zero == -1 or last_one == -1 or first_zero > last_one: print(1) return # 2. 変化可能な区間 [first_zero, last_one] を抽出 target = a[first_zero : last_one + 1] # 3. "0...01...1" という構造をひとつのブロックとして数え上げる # この問題は、連続する 0 の塊の数と、連続する 1 の塊の数を数える # ランレングス圧縮のように考える blocks = [] if not target: print(1) return # 0101... をブロックに分ける # 例: 001101 -> [0011, 01] i = 0 m = len(target) ans = 1 while i < m: # 0の塊を数える zero_count = 0 while i < m and target[i] == '0': zero_count += 1 i += 1 # 1の塊を数える one_count = 0 while i < m and target[i] == '1': one_count += 1 i += 1 # この (0...0) + (1...1) のブロックにおいて、 # 境界線が動ける場所は (0の数 + 1の数) 通り # ただし、最後のブロック以外で 01...1 の形になる場合を考慮 if zero_count > 0 and one_count > 0: ans = ans * (zero_count + one_count) % MOD print(ans) if __name__ == "__main__": solve()