Official

Ex - A Nameless Counting Problem Editorial by leaf1415


下記の \(2\) つの条件をともに満たす長さ \(L\) の数列 \(A\) を、長さ \(L\)良い数列と呼びます。

  • すべての \(i = 1, 2, \ldots, L\) について、\(0 \leq A_i \leq M\)
  • \(A_1 \oplus A_2 \oplus \cdots \oplus A_L = X\)

問題文中の条件とは異なることに注意してください。

[1] 良い数列の個数を求める

長さ \(L\) の良い数列の個数 \(f(L)\) をすべての \(L = 0, 1, 2, \ldots, N\) について求めます。 \(L\) を一つ固定して \(f(L)\) を動的計画法(いわゆる桁 DP )で求めます。 良い数列 \(A\) の全 \(L\) 要素の値を上位ビットから順に確定させていくことを考え、

\(\mathrm{dp}[i][j] = \) (全 \(L\) 要素の上位 \(i\) ビット目までを決定する方法のうち、「その時点で \(M\) より真に小さいことが確定した要素」の個数が \(j\) であるものの個数)

というテーブルを埋めます。 \((i+1)\) ビット目を決定する際、「 \(M\) より真に小さいことがまだ確定していない \((L-j)\) 個の要素のうち何個の要素を \(1\) にするか」に対応した \((L-j+1)\) 本の遷移を \(\mathrm{dp}[i][j]\) から行います。

\(L\) についてこの DP の時間計算量は \(O(L^2\log \max\lbrace M, X\rbrace)\) であり、すべての \(L\) について計算すると \(O(N^3\log \max\lbrace M, X\rbrace)\) 時間です。

[2] 重複のない良い数列の個数を求める

要素の重複がない良い数列の個数 \(g(L)\) をすべての \(L = 0, 1, 2, \ldots, N\) について求めます。 \(L\) を一つ固定し、\(g(L)\) の値を \(f(L)\) から「要素の重複がある長さ \(L\) の良い数列の個数」を引くことで求めます。

\(A\) に奇数個含まれる整数を奇妙な整数と呼ぶことにし、 奇妙な整数である \(A\) の要素を奇妙な要素と呼ぶことにします。

数列 \(A\) の総 XOR は \(A\) の奇妙な整数の総 XOR であることに注意すると、要素の重複がある長さ \(L\) の良い数列であって、

  • 奇妙な要素の個数が \(i\)
  • 奇妙な整数の個数が \(j\)
  • \(A\) に含まれる奇妙でない整数の個数が \(k\)

であるものは以下の方法で得られます。

  • まず、全 \(L\) 要素のうち奇妙な要素の位置 \(i\) 個を選ぶ(全 \(\binom{L}{i}\) 通り)。
  • \(i\) 個の奇妙な要素を、サイズが奇数である \(j\) 個のグループに分け( \(\mathrm{odd}(i, j)\) 通りとおく)、\(j\) 個のグループそれぞれに総 XOR が \(X\) であるような相異なる整数を割り当てる( \(g(j)\) 通り)。
  • \((L-i)\) 個の奇妙でない要素を、サイズが偶数である \(k\) 個のグループに分け( \(\mathrm{even}(L-i, k)\) 通りとおく)、\(k\) 個のグループそれぞれに、\(0\) 以上 \(M\)以下の整数からすでに割り当てた \(j\) 個を除いた \((M+1-j)\) 個の整数のうちから相異なる整数を割り当てる(\(\prod_{l = M+1-j-k+1}^{M+1-j} l\) 通り)。

よって、その個数は

\[\binom{L}{i} \mathrm{odd}(i, j) g(j) \mathrm{even}(L-i, k) \prod_{l = M+1-j-k+1}^{M+1-j} l\]

です。したがって、要素の重複がない良い数列全体の個数は

\[\sum_{i = 0}^L \binom{L}{i} \sum_{j = 0}^{\min\lbrace L-1, i\rbrace} \mathrm{odd}(i, j) g(j) h(L-i, j)\]

と求まります。ここで、

\[h(x, y) \coloneqq \sum_{k= 0}^{x} \mathrm{even}(x, k) \prod_{l = M+1-y-k+1}^{M+1-y} l\]

です。\(h(\cdot, \cdot)\) の必要な値はまとめて \(O(N^2)\) 時間で前計算できます。 また、\(\mathrm{odd}(\cdot, \cdot), \mathrm{even}(\cdot, \cdot)\) はそれぞれ、

\[\mathrm{odd}(i, j) = \sum_{k:\text{奇数}} \binom{i-1}{k-1} \mathrm{odd}(i-k, j-1)\]

および

\[\mathrm{even}(i, j) = \sum_{k:\text{偶数}} \binom{i-1}{k-1} \mathrm{even}(i-k, j-1)\]

によって \(O(N^2)\) 時間で前計算できます。

よって、各 \(L\) について \(O(N^2)\) 時間で \(g(L)\) を求めることができます

[3] 本問題の答えを求める

問題文中の条件を満たす数列は、長さ \(N\) 以下の狭義単調増加な良い数列に、\(0\) 以上 \(M\) 以下の整数をそれぞれ偶数個ずつ追加して得られる長さ \(N\) の数列です。 追加する整数の総数を \(2i\) 個に固定した場合の、問題文中の条件を満たす数列の個数は、

  • 長さ \((N-2i)\) の狭義単調増加な良い数列の個数 \(g(N-2i)/(N-2i)!\) と、
  • \(0\) 以上 \(M\) 以下の整数を、それぞれ偶数個ずつ、合計 \(2i\) 個追加する方法の個数 \(\binom{M+i}{i}\)

の積であるため、本問題の答えは

\[\sum_{i = 0}^{\lfloor \frac{N}{2} \rfloor} \frac{g(N-2i)}{(N-2i)!}\binom{M+i}{i}\]

となります。

posted:
last update: