import sys def solve(): # 入力読み込み s = sys.stdin.read().split() if not s: return a = s[0] n = len(a) MOD = 998244353 # 変化が起きる最小の範囲を特定 first_zero = a.find('0') last_one = a.rfind('1') # 0が1より左にない場合は、1通り(変化不能) if first_zero == -1 or last_one == -1 or first_zero > last_one: print(1) return # 変化可能な区間のみを抽出 target = a[first_zero : last_one + 1] m = len(target) ans = 1 i = 0 while i < m: # 1つ以上の 0 の塊をカウント zero_count = 0 while i < m and target[i] == '0': zero_count += 1 i += 1 # 1つ以上の 1 の塊をカウント one_count = 0 while i < m and target[i] == '1': one_count += 1 i += 1 # この "0...01...1" ブロック内での組み合わせを掛ける # 境界の位置の候補数は (0の数 + 1の数) if zero_count > 0 and one_count > 0: ans = (ans * (zero_count + one_count)) % MOD print(ans) if __name__ == "__main__": solve()