AT_kupc2020_m Many Parentheses
Description
[problemUrl]: https://atcoder.jp/contests/kupc2020/tasks/kupc2020_m
括弧列は、`(` と `)` からなる文字列です。 正しい括弧列を、次のいずれかの条件を満たすものと定義します。
- 空文字列
- 正しい括弧列 $ A $ が存在し、`(` , $ A $ , `)` をこの順に結合した文字列
- 空でない正しい括弧列 $ S,T $ が存在し、$ S $ , $ T $ をこの順に結合した文字列
いま、$ N $ 個の互いに区別できる箱があります。
あなたは $ N $ 個の箱それぞれに正しい括弧列を入れようと考えています。ただし、次の2つの条件をともに満たすように入れる必要があります。
- $ N $ 個の箱に含まれる `(` の個数の合計が $ M $ になる。
- 長さが $ 2\ \times\ K $ である括弧列はどの箱にも入れてはならない。
条件を満たす入れ方の総数を $ 998244353 $ で割ったあまりを求めてください。
ただし、$ 2 $ つの入れ方が異なることを、「ある箱が存在し、そこに入れた括弧列が異なること」と定義します。
Input Format
入力は以下の形式で標準入力から与えられる。
> $ N $ $ M $ $ K $
Output Format
答えを1行に出力せよ。
Explanation/Hint
### 制約
- $ 1\ \leq\ N\ \leq\ 10^6 $
- $ 1\ \leq\ M\ \leq\ 10^6 $
- $ 1\ \leq\ K\ \leq\ M $
### 部分点
- $ 1\ \leq\ N,M\ \leq\ 2000 $ を満たすデータセットに正解した場合は、$ 10 $ 点が与えられる。
- 追加制約のないデータセットに正解した場合は、上記とは別に $ 490 $ 点が与えられる。
### Sample Explanation 1
\- `(())` , 空 - `()()` , 空 - 空 , `(())` - 空 , `()()` の $ 4 $ 通りです。