AT_arc194_d [ARC194D] Reverse Brackets

Description

以下のいずれかの条件を満たす文字列を**正しい括弧列**と定義します。 - 空文字列 - ある正しい括弧列 $ A $ が存在して、`(`, $ A $ , `)` をこの順に連結した文字列 - ある空でない正しい括弧列 $ A $ , $ B $ が存在して、 $ A $ , $ B $ をこの順に連結した文字列 長さ $ N $ の正しい括弧列 $ S $ が与えられます。あなたは以下の操作を何度でも行うことができます。 - $ S $ の連続部分文字列のうち、正しい括弧列であるものを $ 1 $ 個選び、反転させる。 ここで $ S $ の $ l $ 文字目から $ r $ 文字目までからなる連続部分文字列を反転させるとは、以下を行うことを指します。 - $ l \le i \le r $ を満たす整数 $ i $ に対して同時に $ S_i $ を $ S_{l+r-i} $ が `(` なら `)` に、`)` なら `(` に置き換える。(ここでの反転は、通常の反転の定義とは異なる点に注意してください。) 操作終了時にあり得る $ S $ の個数を $ 998244353 $ で割ったあまりを求めてください。

Input Format

入力は以下の形式で標準入力から与えられる。 > $ N $ $ S $

Output Format

答えを出力せよ。

Explanation/Hint

### Sample Explanation 1 例えば、以下のように操作をすることで、 $ S $ を `()(())` にすることができます。 - $ S $ の連続部分列として、 $ S $ の $ 1 $ 文字目から $ 6 $ 文字目を選ぶ。これは正しい括弧列である。 $ S $ が `()(())` となる。 他に作ることのできる $ S $ は `(())()` のみです。よって答えは $ 2 $ です。 ### Constraints - $ 1 \le N \le 5000 $ - $ |S|=N $ - $ S $ は正しい括弧列