Prefix XORs - AtCoder Regular Contest 137 D
AtCoder Regular Contest 137 D - Prefix XORs の解法です. コンテスト中に解いた方法 (実験結果から適当に求める) をベースに, 公式解説を参照して追加しました. リュカの定理の証明もWikipediaを見て書きました. 問題概要 長さ$N$の整数列 $A = (A_1, \ldots, A_N)$ と整数 $M$ が与えられる. 下の操作を$k$回行ったあとの $A_i$ の値を $A(i, k)$ と書くことにする. $k = 1, 2, \ldots, M$ について,$A(N, k)$ を求めよ. 操作: 各$i = 1, 2, \ldots, N$ について, $A_i$ を同時に $A_1 \oplus A_2 \oplus \cdots \oplus A_i$ で置き換える. 制約: $1 \leq N, M \leq 10^6$; $0 \leq A_i < 2^{30}$ 問題へのリンク 解法 実験 $A(i, k)$ は,$A_1, \ldots, A_i$ のいくつかのXORをとったものになる. そこで,$a(i, m, k) \in \{0, 1\}$ をとって, $A(i, k) = \bigoplus_{m=1}^{i} a(i,m,k) A_m$ と書く. 計算してみると分かるとおり,$a(i, m, k)$ は,$i - m$ と $k$ にしか 依存しない.そこで,$b(j, k) := a(j, 0, k)$ と書くことにする. $A(i, k) = \bigoplus_{m=1}^{i} b(i - m, k) A_m = \bigoplus \{ A_{i - j} \mid b(j, k) = 1; j = 0, \ldots, i-1 \}$ だから, 各 $k = 1, 2, \ldots, M$ について,$b(j, k) = 1$ となる $j$ を (高速に) 列挙できれば良い....