問題一覧 > 通常問題

No.1878 union-find の数え上げ

レベル : / 実行時間制限 : 1ケース 2.000秒 / メモリ制限 : 512 MB / 標準ジャッジ問題
タグ : / 解いたユーザー数 40
作問者 : 37zigen37zigen / テスター : tko919tko919 👑 colognecologne
6 ProblemId : 7551 / 出題時の順位表 / 自分の提出
問題文最終更新日: 2022-03-18 21:50:27

概略

何らかの操作によってできた union-find を表す根付き木 $T$ があります。
この union-find には経路圧縮が実装されていませんでしたが、経路圧縮が実装されていた場合にあり得た union-find の木 \(S\) は何通りあるでしょうか。

つまり

  • 経路圧縮がないとき、根付き木 \(T\)
  • 経路圧縮があるとき、根付き木 \(S\)
となるような \(S\) は \(T\) を固定したとき、何通りあるでしょうか。

問題

木 $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) を行うと左から四つ目の木になります。

操作列は他にもありますが、結局この四つの木のいずれかができます。 例えば、union(2, 3), union(3, 4), root(4), union(1, 2) という操作列は前述のいずれにも該当しませんが、 木 $T$ ができます。

提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。