Official

K - K-rep Array Editorial by Mitsubachi


この解説では,0-indexed とします.

数列 $V$ が $K$-rep である条件は $V_{i} = V_{i + K}$ が $0 \leq i < N - K$ について成立することです.すなわち,$V_i$ は $i$ を $K$ で割った余りのみに依存するということです.
これより,$V$ が $K$-rep でない条件は $V_{i} \neq V_j$ かつ $i - j$ が $K$ の倍数となる $(i, j)$ が存在することです.
したがって,$A$ における問題では $A_i \neq A_j$ かつ $A_i \neq -1, A_j \neq -1$ であり,$i - j$ が $K$ の倍数となる $(i, j)$ が存在するかを判定すれば良いです.

そこで,$A_i \neq A_j$ かつ $A_i \neq -1, A_j \neq -1$ となるような $|i - j|$ としてありうる値の集合 $S$ を求めることを考えます.これはワイルドカードマッチングというものを用います.
具体的には,以下の手法で表すことができます.

  • $f(x, y) = xy \left( x - y \right)^2$ とします.また,$A_i = -1$ であるような $A_i$ について,$A_i = 0$ とします.
  • $A'$ を $A$ を逆順にした数列とします.
  • $A$ と $A'$ の畳み込み $C$ を求めます.ここで,$C_i = \sum_{j = 0}^{i} f(A_j, A'_{i - j})$ です.
  • $C_i \neq 0$ となる $i$ について $N - i - 1$ を集めた集合が求めるべき集合 $S$ です.

$x, y$ が非負のもとでは $f(x, y)$ が $x \neq y, x \neq 0, y \neq 0$ のとき正であり,そうでないとき $0$ となることより正当性が示せます.
具体的に畳み込みを求めるときは,$f(x, y)$ を $f(x, y) = xy \left( x - y \right)^2 = x^3y - 2x^2y^2 + xy^3$ と展開して,各項ごとに求めると良いです.例えば,$x^3y$ に相当する項を求める際には,$A_i := A_i^3$ として畳み込み演算を行えば良いです.

$S$ を求めたあとは,$K = 1, 2, \ldots, N$ について $S$ の要素で $K$ の倍数となるものが存在するかを判定すれば良いです.
これはメビウス変換で行うことができます.愚直に $K$ の倍数を全て見ても調和級数の議論より十分高速です.

以上の議論より,この問題は $O(N \log N)$ で解けました.

なお,$C$ の値はこの問題の制約では long long の範囲に収まらないことがあるので注意してください.具体的にはいくつかの素数 $P$ を用いて $\mathrm{mod} \ P$ 上で $C$ を計算し,その全てで $C_i = 0$ となることを確認すれば良いです.$C_i$ の真の値の上界として $N^5 < 10^{27}$ が得られるため,用いる素数 $P$ の積が上界以上ならば決定的な解法です.

posted:
last update: