MOD = 998244353 s = input().strip() n = len(s) from collections import defaultdict # Initialize DP with the starting state (balance 0, count 1) dp = defaultdict(int) dp[(0, 0)] = 1 for i in range(n): new_dp = defaultdict(int) current_char = s[i] for (lo_prev, hi_prev), cnt in dp.items(): if current_char == '.': # Replace with '(' new_lo = lo_prev + 1 new_hi = hi_prev + 1 new_dp[(new_lo, new_hi)] = (new_dp[(new_lo, new_hi)] + cnt) % MOD # Replace with ')' new_lo_r = max(lo_prev - 1, 0) new_hi_r = hi_prev - 1 if new_hi_r >= 0: new_dp[(new_lo_r, new_hi_r)] = (new_dp[(new_lo_r, new_hi_r)] + cnt) % MOD # Replace with '?' new_lo_q = max(lo_prev - 1, 0) new_hi_q = hi_prev + 1 new_dp[(new_lo_q, new_hi_q)] = (new_dp[(new_lo_q, new_hi_q)] + cnt) % MOD else: if current_char == '(': new_lo = lo_prev + 1 new_hi = hi_prev + 1 new_dp[(new_lo, new_hi)] = (new_dp[(new_lo, new_hi)] + cnt) % MOD elif current_char == ')': new_lo = max(lo_prev - 1, 0) new_hi = hi_prev - 1 if new_hi >= 0: new_dp[(new_lo, new_hi)] = (new_dp[(new_lo, new_hi)] + cnt) % MOD else: # current_char is '?' new_lo = max(lo_prev - 1, 0) new_hi = hi_prev + 1 new_dp[(new_lo, new_hi)] = (new_dp[(new_lo, new_hi)] + cnt) % MOD dp = new_dp result = 0 if n % 2 != 0: print(0) else: for (lo, hi), cnt in dp.items(): if lo <= 0 <= hi: result = (result + cnt) % MOD print(result % MOD)