AT_ttpc2023_n Bracket Sequestion
Description
正整数 $ N $ と素数 $ M $ が与えられます。
`(`, `?`, `)` からなる文字列で以下の条件を満たすものを **良い文字列** と定義します。
- 文字列に含まれる `?` をそれぞれ `(` あるいは `)` に置き換えることで **バランスの取れた括弧列** にすることができる。
長さ $ 2N $ の良い文字列の個数を $ M $ で割ったあまりを求めてください。
ただし、**バランスの取れた括弧列** とは以下のいずれかの条件を満たす文字列のことです。
- 空文字列
- あるバランスの取れた括弧列 $ A $ が存在して、`(`, $ A $ , `)` をこの順に連結した文字列
- ある空でないバランスの取れた括弧列 $ A,B $ が存在して、 $ A,B $ をこの順に連結した文字列
Input Format
入力は以下の形式で標準入力から与えられる。
> $ N $ $ M $
Output Format
答えを出力せよ。
Explanation/Hint
### 部分点
- 追加の制約 $ N\leq 5\times 10^{6} $ を満たすデータセットに正解した場合は $ 70 $ 点が与えられる。
### Sample Explanation 1
長さが $ 2N=2 $ の良い文字列は `()`, `(?`, `?)`, `??` の $ 4 $ つです。
### Sample Explanation 4
入力例 $ 4 $ のケースは部分点には含まれません。
### Constraints
- $ 1\leq N\leq 9\times 10^{8} $
- $ 9\times 10^{8}\leq M\leq 10^{9} $
- $ M $ は素数
- 入力は全て整数