B - Binary Tree Counting 解説 /

実行時間制限: 2 sec / メモリ制限: 1024 MiB

配点 : 100 点

問題文

頂点 1, 2, \dots, N の N 頂点からなる二分木であって、以下の条件を全て満たすものの個数を 998244353 で割った余りを求めてください。

  • 各 i = 1, 2, \dots, N に対し、頂点 i の行きがけ順は i である。特に、頂点 1 が根である。
  • 各 i = 1, 2, \dots, M に対し、頂点 A_i の通りがけ順は B_i である。

ただし、2 つの二分木が異なるとは、ある頂点 v が存在して、以下のいずれかが成り立つことを指します。

  • v の左の子の有無または頂点番号が異なる。
  • v の右の子の有無または頂点番号が異なる。
二分木とは 二分木とは、各頂点が高々 1 個の左の子と高々 1 個の右の子を持つ根付き木です。
行きがけ順・通りがけ順とは 二分木の各頂点 v の行きがけ順・通りがけ順は、以下の擬似コードにおいて dfs(根) を実行した際に記録される preorder[v] および inorder[v] の値として定義されます。
pre_cnt = 1; in_cnt = 1
def dfs(v):
    preorder[v] = pre_cnt; pre_cnt += 1
    if v の左の子が存在する:
        dfs(v の左の子)
    inorder[v] = in_cnt; in_cnt += 1
    if v の右の子が存在する:
        dfs(v の右の子)

制約

  • 入力は全て整数
  • 1 \leq M \leq N \leq 500
  • 1 \leq A_i, B_i \leq N
  • A_i \neq A_j \ (i \neq j)
  • B_i \neq B_j \ (i \neq j)

入力

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

N M
A_1 B_1
A_2 B_2
\vdots
A_M B_M

出力

答えを 1 行に出力せよ。


入力例 1

3 1
2 1

出力例 1

2

次の 2 つの二分木が条件を満たします。

  • 頂点 1 が根で、頂点 2 が頂点 1 の左の子で、頂点 3 が頂点 2 の右の子である二分木。この二分木において、
    • 頂点 1 の行きがけ順は 1、通りがけ順は 3 です。
    • 頂点 2 の行きがけ順は 2、通りがけ順は 1 です。
    • 頂点 3 の行きがけ順は 3、通りがけ順は 2 です。
  • 頂点 1 が根で、頂点 2 が頂点 1 の左の子で、頂点 3 が頂点 1 の右の子である二分木。 この二分木において、
    • 頂点 1 の行きがけ順は 1、通りがけ順は 2 です。
    • 頂点 2 の行きがけ順は 2、通りがけ順は 1 です。
    • 頂点 3 の行きがけ順は 3、通りがけ順は 3 です。

入力例 2

5 3
1 3
2 5
4 2

出力例 2

0

条件を満たす二分木は存在しません。


入力例 3

30 6
12 26
9 5
15 14
19 15
4 2
10 4

出力例 3

550222816