#agc056f. [agc056_f]Degree Sequence in DFS Order
[agc056_f]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)
ここで,変数 はグラフ を隣接リストとして表したものであり,g\[v\] は頂点 に隣接する頂点を任意の順番で格納したリストである.
例えば, の時, を生成することは可能です. そのためには,以下のようなグラフ を用意すればよいです.
ここで,頂点にかかれている数は,その頂点を DFS で何番目に訪れたかを表しています.( と書かれた頂点から DFS を開始しています.) また,オレンジ色の矢印は DFS での遷移を示しており,その横の数字は辺をたどる順番を表しています.
制約
- 入力される値はすべて整数である
入力
入力は以下の形式で標準入力から与えられる.
出力
答えを出力せよ.
入力例 1
2 2
出力例 1
1
あり得るのは のみです. は多重辺を持ってもよいことに注意してください.
入力例 2
3 4
出力例 2
9
入力例 3
10 20
出力例 3
186225754
入力例 4
100000 1000000
出力例 4
191021899