説明では添字を 0 から N−1 までとし、すべての添字を N を法として解釈する。
同じ開始位置で操作を二回行うと打ち消し合う。したがって、位置 i から始まる操作を奇数回使うかどうかを xi∈{0,1} とすればよい。
位置 i を最終的に 0 にするための条件は
ai=j=i−K+1⨁i
である。隣接する二つの式を XOR すると
xi⊕xi−K=
を得る。
d=gcd(N,K)、m=N/d、h=K/ とする。写像 は、添字を長さ のちょうど 個の巡回に分解する。
剰余類 r に対して
Pr=i≡r(modd)⨁
と定義する。一つの巡回に属する差分式をすべて XOR した値は Pr⊕Pr−1 である。したがって差分式が矛盾なく解けるための必要十分条件は
P0=P1=⋯=P
である。
一つの巡回を
vt=r+tK(modN),
の順に並べる。canonical 解を
xv0=0,x
とする。巡回 r に含まれる x=1 の個数を cr とする。
差分式だけを見ると、各巡回全体を反転する自由変数 yr が一つある。yr=0 のコストは 、 のコストは である。よって差分式だけを満たす最小コストは
B=r∑min(cr,m−c
である。
差分式は元の式同士の差しか使っていないため、元の式をもう一つ満たす必要がある。位置 0 の式に対して
E=a0⊕j=−K+1⨁0
とおく。必要なのは E=0 である。
長さ K の区間には、各剰余類からちょうど h=K/d 個の位置が含まれる。
h が偶数なら、巡回全体を反転しても E は変化しない。したがって E=1 なら不可能であり、E=0 なら答えは B である。
h が奇数なら、各 yr は E を一回反転するので
y0⊕y1⊕⋯⊕y
が必要である。各巡回でコストが小さい側を
zr=[cr>m/2],
とする。Z=E なら答えは B である。そうでなければ一つの巡回で反対側を選ぶ必要があり、追加コストは
rmin∣m−2cr∣
である。
クエリで ap を反転すると、Δp と Δ だけが反転し、 だけが反転する。したがって である剰余類の個数を持てば、すべての が等しいかを で判定できる。
巡回内で Δvs を反転すると、s≥1 のとき canonical 解の
xvs,xv
という suffix がすべて反転する。s=0 の Δv0 は巡回を閉じる整合条件にだけ使われるため、canonical 解自体は変化しない。
各巡回を巡回順に連結した長さ N の配列を作り、区間反転と区間内の 1 の個数を扱う lazy segment tree を用いる。各クエリでは suffix 反転は高々二回で、影響を受けた巡回の cr だけを再計算すればよい。
cr が変化するたびに、次を同時に管理する。
- B=∑rmin(cr,m−c
E も毎回再計算する必要はない。Δu を反転したときに変化する canonical suffix と、E に使う長さ K の区間との共通部分の個数の偶奇を として前計算する。巡回の先頭では である。位置 のクエリでは
E⊕=[p=0]⊕impact[p]⊕impact
と更新できる。
以上より各クエリの答えは次の通りである。
- Pr がすべて等しくなければ
-1。
- h が偶数なら、E=1 のとき
-1、そうでなければ B。
- が奇数なら、。
各テストケースの前処理は O(NlogN)、各クエリは O(logN) である。全体の計算量は O((N+Q、メモリ使用量は である。
Solution written by GPT5.6