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: