MOD = 998244353 def solve_tile_problem(N, M, A): # dp[i][j] = number of ways to reach state up to tile i with j operations dp = [0] * (N + 1) dp[0] = 1 # base case: 0 tiles, 0 operations, 1 way for op in range(M): # Use difference array technique to simulate flipping new_dp = [0] * (N + 2) for l in range(N): for r in range(l, N): new_dp[l] = (new_dp[l] + dp[l]) % MOD new_dp[r + 1] = (new_dp[r + 1] - dp[l]) % MOD # Apply prefix sum to get actual counts for i in range(1, N + 1): new_dp[i] = (new_dp[i] + new_dp[i - 1]) % MOD # Move new_dp to dp for next round dp = new_dp[:N + 1] # Now count how many dp values match final configuration A result = 0 for i in range(N + 1): valid = True for j in range(N): flips = 0 # simulate number of flips at position j for k in range(i): if k <= j: flips += 1 if flips % 2 != A[j]: valid = False break if valid: result = (result + dp[i]) % MOD return result # Example usage: N, M = map(int, input().split()) A = list(map(int, input().split())) print(solve_tile_problem(N, M, A))