B - Odd Namori Editorial
by
Nyaan
まず、元の問題は \(2^{(閉路の個数)}\) の部分が扱いづらいので、適切な言い換えを行うことを考えます。すると、次のような言い換えが考えられます。
functional graph である \(G\) および頂点の集合 \(S \subseteq \lbrace 1,2, \dots, N \rbrace\) (\(S\) は空でもよい) に対して \(f(G, S)\) を次のように定義する。
- 次の条件のうち少なくとも \(1\) つを満たす場合、\(f(G, S) = 0\) とする。
- ある \(i\) \((2 \leq i \leq N)\) に対して \(G\) が辺 \(i \to p_i\) を含む
- \(G\) が \(u \in S, v \not \in S\) である辺 \(u \to v\) を含む
- \(u \in S\) である頂点 \(u\) が \(G\) において閉路上に存在しない
- そうでない場合、\(S\) によって誘導される \(G\) の部分グラフはいくつかの点素な閉路のみからなる。この時、誘導部分グラフに含まれる偶数長の閉路の個数を \(x\) として、\(f(G, S) = (-1)^x\) とする。
全ての \((G, S)\) に対する \(f(G, S)\) の総和 \(\text{mod }998244353\) を求めよ。
この言い換えにおいて、良いグラフ \(G\) に対する \(f(G, S)\) の総和が \(2^{(G に含まれる閉路の個数)}\) に、良いグラフでないグラフ \(G\) に対する \(f(G, S)\) の総和が \(0\) になっていることが確認できます。よってこの言い換えは正当です。
頂点集合 \(S\) を固定した時の \(f(G, S)\) の総和を考えてみると、次の部分問題の答えに定数を掛けたものになります。
\(m\) 頂点の permutation graph \(G'\) に対して \(f(G')\) を \((-1)^{(G' に含まれる偶数長の閉路の個数)}\) として定義する。
ただしいくつかの辺が ban されていて、\(G'\) に ban されている辺が含まれる場合 \(f(G') = 0\) とする。ban される辺を辺集合とするグラフは DAG でありかつ全ての頂点の出次数が \(1\) 以下である。
全ての permutation graph \(G'\) に対する \(f(G')\) の総和は?
この部分問題を解きます。まず ban されている辺が存在しない場合の問題を考えると、答えは \(1 \text{ if } m \leq 1 \text{ else } 0\) であるとわかります。(この事実は、例えば母関数を用いた考察、あるいは偶置換・奇置換を用いた考察により証明できます。)
ban されている辺が存在する場合は、ban されている辺集合に対する包除原理を用いると
- ban されている辺集合が \(m-1\) 辺のパスグラフをなす場合、\(1\)
- そうでない場合、\(0\)
であることが確認できます。よって部分問題を解くことが出来ました。
部分問題の結論を活用すると、結局 \(S\) を固定した時の \(f(G, S)\) の総和は大半が \(0\) で、非 \(0\) となるのは \(S\) が空集合であるか、根付き木 \(T\) の \(S\) による誘導部分グラフが \(i - p_i - p_{p_i} - \dots\) という形をしたパスグラフをなす場合のみで、高々 \(\mathrm{O}(N^2)\) 通りです。さらに累積和を利用すると \(\mathrm{O}(N)\) で \(f(G, S)\) 全体の総和を計算できることが確認できます。
以上の内容を実装すると \(\mathrm{O}(N)\) でこの問題を解くことが出来て、これは十分高速です。
posted:
last update: