import sys def solve(): input_data = sys.stdin.read().split() if not input_data: return a = input_data[0] n = len(a) MOD = 998244353 # 1. 最初に出現する '0' と、最後に出現する '1' を探す first_zero = a.find('0') last_one = a.rfind('1') # 2. '0' が存在しない、'1' が存在しない、または 0が1より後ろにしかない場合 # このときは文字列を変化させることができない if first_zero == -1 or last_one == -1 or first_zero > last_one: print(1) return # 3. 変化可能な範囲は [first_zero, last_one] # この範囲内にある "01" という並びが、自由度を生む ans = 1 count = 0 # 範囲内を走査して、連続する 0...1 の塊を数える # 実際には、'0' が出た後に '1' が出る箇所の「隙間」を数え上げます for i in range(first_zero, last_one): if a[i] == '0' and a[i+1] == '1': count += 1 # 各 01 ペアについて、その間をどう埋めるかが選択肢になる # 正確には「0...1」という構造の数 + 1 が答えに関わります # この問題のケースでは、(01の数 + 1) ではなく、 # 連続する「自由区間」の長さを用いた計算が適切です。 # --- 再修正方針 --- # 実は、この問題は「0...1」となっている箇所の # 01, 001, 011 などの「変化できる塊」を分離して考えます。 res = 1 free_zones = [] i = first_zero while i < last_one: if a[i] == '0': # 0から始まる 0...1 の区間を探す j = i found_one = False while j <= last_one: if a[j] == '1': found_one = True if found_one and (j == last_one or a[j+1] == '0'): # 0...1 のひと塊が終了 res = res * (j - i + 1) % MOD i = j break j += 1 i += 1 print(res) solve()