No.1878 union-find の数え上げ
タグ : / 解いたユーザー数 40
作問者 : 37zigen / テスター : tko919 cologne
概略
何らかの操作によってできた union-find を表す根付き木 $T$ があります。
この union-find には経路圧縮が実装されていませんでしたが、経路圧縮が実装されていた場合にあり得た union-find の木 \(S\) は何通りあるでしょうか。
つまり
- 経路圧縮がないとき、根付き木 \(T\)
- 経路圧縮があるとき、根付き木 \(S\)
問題
木 $T$ を、頂点 $1$、頂点 $2$、…、頂点 $N$ からなり、頂点 $1$ を根とする根付き木とします。
木 $T$ の頂点 $2 \leq i \leq N $ の親は $p_i$ です。
この木は、それぞれ頂点 $1$、頂点 $2$、…、頂点 $N$ からなる $N$ 個の $1$ 頂点根付き木に対して、
次の $2$ つの操作を $0$ 回以上行うことで得られたことが分かっています。
- union(a, b)
- 根 $a$ と根 $b$ を辺で接続して、$a$ を $b$ の親とする。
- root(a)
- 頂点 $a$ の先祖を辿り、見つけた根を返す。
経路圧縮ありだと、root のアルゴリズムは
- root(a)
- 頂点 $a$ の先祖を辿り、見つけた根を返す。その際、根を除く $a$ の先祖($a$ 自身を含む)の親を根に変更する。
経路圧縮があった場合にあり得た木の個数を $998244353$ で割った余りを求めてください。
入力
$N$ $p_2$ $p_3$ $\vdots$ $p_N$
- $1 \leq N \leq 10^5$
- $1 \leq p_i \leq N$
- 入力中の値は全て整数である。
- 入力が表すグラフは木である。
出力
最後に改行してください。
サンプル
サンプル1
入力
1
出力
1
サンプル2
入力
4 1 2 2
出力
4
経路圧縮が実装されている場合、union(2, 3), union(2, 4), union(1, 2) によって木 $T$ ができた後に、
- 何もしないと左から一つ目の木に、
- root(3) を行うと左から二つ目の木に、
- root(4) を行うと左から三つ目の木に、
- root(3) と root(4) を行うと左から四つ目の木になります。
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。