Official

E - Distance on Large Perfect Binary Tree Editorial by kyopro_friends


頂点 \(1\) を根とします。各頂点について、頂点 \(1\) からの距離をその頂点の深さと呼びます。また、葉でない頂点 \(i\) について、頂点 \(2i\) の部分木を左側、頂点 \(2i+1\) の部分木を右側と呼ぶことにします。

\(0\) 以上 \(2N\) 以下の整数 \(n\) について、\(2^n \mod 998244353\) を前計算しておくことで、これらの値は \(O(1)\) で得られるとして良いです。

各頂点 \(v\) について、「距離が \(D\) である頂点の組 \((i,j)\)であって、\(i,j\) のLCA (Lowest Common Ancestor) が \(v\)であるようなもの」の個数を考え、これを \(f(v)\) とおきます。求めるものは全ての頂点についての \(f(v)\) の合計です。

\(v\) の深さを \(d\) とします。
\(v=i\) または \(v=j\) の場合、他方の頂点は \(v\) の子孫である深さ \(d+D\) の頂点から自由に選ぶことができます。このようなケースの個数は \(d+D\)\(N-1\) を超えるかどうかのみに依存して \(0\) または \(2^D\) であるため、\(O(1)\) で求められます。
それ以外の場合、各 \(0< k< D\) で、\(i\)\(v\) の左側にある深さ \(d+k\) の頂点、\(j\)\(v\)の右側にある深さ \(d+(D-k)\) の頂点から、それぞれ自由に選ぶことができます。「\(i\)\(v\) の左側の深さ \(d+k\) の頂点、\(j\)\(v\)の右側の深さ \(d+(D-k)\) の頂点から、それぞれ自由に選ぶ方法の数」は \(d+k\) 及び \(d+(D-k)\)\(N-1\) を超えるかどうかのみに依存して \(0\) または \(2^{D-2}\) となるため、適切な場合分けにより全ての \(k\) に関する個数の合計を \(O(1)\) で求めることができます。

以上より、\(v\) を固定するごとに \(f(v)\)\(O(1)\) で求められることがわかりました。

木が完全二分木であることから、\(f(v)\)\(v\) の深さのみに依存することがわかります。深さが \(d\) であるような頂点の個数は \(2^d\) なので、深さ \(d=0,1,\ldots,N-1\) の頂点に関する \(f(v)\) の和をそれぞれを \(O(1)\) で求めることができ、全体で \(O(N)\) で問題が解けました。

posted:
last update: