atcoder#AGC056F. [AGC056F] Degree Sequence in DFS Order
[AGC056F] Degree Sequence in DFS Order
配点 : 点
問題文
整数 と が与えられます. 以下の手順で生成されうる整数列 の個数を で割った余りを求めてください.
- 頂点, 辺からなる連結な無向グラフ を用意する. ここで, は自己ループを含んではならないが,多重辺を含んでもよい.
- 上で DFS を行い, () 番目に訪れた頂点の次数を とする. より正確には,以下の疑似コードを実行して を得る.
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)
ここで,変数 はグラフ を隣接リストとして表したものであり, は頂点 に隣接する頂点を任意の順番で格納したリストである.
例えば, の時, を生成することは可能です. そのためには,以下のようなグラフ を用意すればよいです.
ここで,頂点にかかれている数は,その頂点を DFS で何番目に訪れたかを表しています.( と書かれた頂点から DFS を開始しています.) また,オレンジ色の矢印は DFS での遷移を示しており,その横の数字は辺をたどる順番を表しています.
制約
- 入力される値はすべて整数である
入力
入力は以下の形式で標準入力から与えられる.
出力
答えを出力せよ.
2 2
1
あり得るのは のみです. は多重辺を持ってもよいことに注意してください.
3 4
9
10 20
186225754
100000 1000000
191021899