atcoder#AGC056F. [AGC056F] Degree Sequence in DFS Order

[AGC056F] Degree Sequence in DFS Order

配点 : 16001600

問題文

整数 NNMM が与えられます. 以下の手順で生成されうる整数列 a=(a1,a2,,aN)a=(a_1,a_2,\cdots,a_N) の個数を 998244353998244353 で割った余りを求めてください.

  • NN 頂点,MM 辺からなる連結な無向グラフ GG を用意する. ここで,GG は自己ループを含んではならないが,多重辺を含んでもよい
  • GG 上で DFS を行い,ii (1iN1 \leq i \leq N) 番目に訪れた頂点の次数を aia_i とする. より正確には,以下の疑似コードを実行して aa を得る.
a = empty array

dfs(v):
    visited[v]=True
    a.append(degree[v])
    for u in g[v]:
        if not visited[u]:
            dfs(u)

dfs(arbitrary root)

ここで,変数 gg はグラフ GG を隣接リストとして表したものであり,g[v]g[v] は頂点 vv に隣接する頂点を任意の順番で格納したリストである.

例えば,N=4,M=5N=4,M=5 の時,a=(2,4,1,3)a=(2,4,1,3) を生成することは可能です. そのためには,以下のようなグラフ GG を用意すればよいです.

picture

ここで,頂点にかかれている数は,その頂点を DFS で何番目に訪れたかを表しています.(11 と書かれた頂点から DFS を開始しています.) また,オレンジ色の矢印は DFS での遷移を示しており,その横の数字は辺をたどる順番を表しています.

制約

  • 2NM1062 \leq N \leq M \leq 10^6
  • 入力される値はすべて整数である

入力

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

NN MM

出力

答えを出力せよ.

2 2
1

あり得るのは a=(2,2)a=(2,2) のみです. GG は多重辺を持ってもよいことに注意してください.

3 4
9
10 20
186225754
100000 1000000
191021899