問題一覧 > 通常問題

No.1878 union-find の数え上げ

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

概略

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

つまり

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

問題

T を、頂点 1、頂点 2、…、頂点 N からなり、頂点 1 を根とする根付き木とします。 木 T の頂点 2iN の親は pi です。
この木は、それぞれ頂点 1、頂点 2、…、頂点 N からなる N 個の 1 頂点根付き木に対して、 次の 2 つの操作を 0 回以上行うことで得られたことが分かっています。

  • union(a, b)
    • a と根 b を辺で接続して、ab の親とする。
  • root(a)
    • 頂点 a の先祖を辿り、見つけた根を返す。

経路圧縮ありだと、root のアルゴリズムは

  • root(a)
    • 頂点 a の先祖を辿り、見つけた根を返す。その際、根を除く a の先祖(a 自身を含む)の親を根に変更する。
となります。

経路圧縮があった場合にあり得た木の個数を 998244353 で割った余りを求めてください。

入力

N
p2
p3

pN
  • 1N105
  • 1piN
  • 入力中の値は全て整数である。
  • 入力が表すグラフは木である。

出力

最後に改行してください。

サンプル

サンプル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もしくは右上の雲マークをクリックしてアカウントを作成してください。