能把开关/线性关系写成增广矩阵,在实数、有限域和 XOR 域中选择正确消元运算;判断无解、唯一解、多解,并由秩计算自由变量数。
前置:线性方程、模逆、异或。
高斯消元的本质是做不改变解集的初等行变换,逐列选择主元并消去其他行。真正需要记录的不是“消到第几行”,而是秩:
rank=variables:唯一解;运算域决定细节:实数要选绝对值较大主元并用 eps;模质数用逆元;XOR 域中加减都是 XOR,非零主元只有 1,可用 bitset 加速。
row<equations 与列范围。[0,p);负数修正。令 $x_{r,c}$ 表示是否按格子。灯 $(r,c)$ 最终状态等于初态 XOR 自己及四邻按键,要求为 0,得到 30 元 XOR 方程。对增广矩阵做 Gauss-Jordan;题目数据保证可输出方案。每个方程恰表达一盏灯最终熄灭,解向量与按键方案双向等价。
for each lamp cell:
equation has variables at self and four neighbors
rhs = initial lamp state
for each variable column:
find pivot row with bit 1; swap
XOR pivot row into every other row having this bit
output solved variable bits as 5x6 grid
消元只需行阶梯形。若零系数行 RHS 为 1 则无解;否则每个非主元变量可独立取 0/1,主元由它们唯一确定,所以方案数为 $2^{n-rank}$。方程逐状态精确表达所有影响 XOR,故解与操作集合一一对应。
matrix[target_switch][pressed_switch] = whether press affects target
rhs = initial XOR target
rank = XOR_Gaussian_elimination(matrix)
if contradictory row exists: print unreachable
else: print 2 ** (n - rank)
建立 $m\times(n+1)$ 模 7 增广矩阵。逐列找非零主元,乘逆元归一,并消去其他行。初等行变换在域 $\mathbb F_7$ 上可逆,因此保持解集;矛盾行、秩与变量数分别给出三种结论。唯一解按题目代表元映射输出。
复杂度 $O(mn\min(m,n))$,本题规模可行。
build equations modulo 7
for each variable column:
select nonzero pivot
normalize pivot by modular inverse
eliminate this column from all other rows
check contradiction; compare rank with variable count
给定 $1\le N\le60$ 的简单无向图。给每个点 $v$ 写一个 $1\le X_v<2^{60}$ 的整数,使每个非孤立点的所有邻点所写整数 XOR 为 0;判断是否存在并构造。
以图的邻接矩阵 $A$ 为系数矩阵。对每个二进制位 $k$,所有点该位组成列向量 $x^{(k)}$,则点 $v$ 的邻点 XOR 在该位为 $(Ax^{(k)})_v$。所以一个合法位必须属于 $\ker A$;孤立点对应全零行,条件自动成立。
Gauss-Jordan 消元后,每个自由变量取 1、其他自由变量取 0,并回代主元变量,得到零空间基 $b0,\ldots,b{d-1}$。构造
$$ Xv=\sum{k=0}^{d-1} b_k[v]2^k. $$
每一位 $b_k$ 都满足 $Ab_k=0$,故所有非孤立点的邻点 XOR 为 0。若所有 $X_v>0$,范围也满足 $X_v<2^d\le2^{60}$,构造合法。
反过来,若某个 $X_v=0$,说明每个基向量在坐标 $v$ 都为 0。基张成整个零空间,所以任意合法位向量在该坐标都为 0,任何整数构造都只能令该点为 0,不可能有解。因此最后的非零检查既充分又必要。
用 64 位整数存每行,消元时间 $O(N^3/64)$ 的位运算实现(按当前逐行写法可视为 $O(N^3)$、但 $N\le60$),空间 $O(N)$ 个机器字。
A = adjacency matrix over GF(2)
RREF(A); record pivot columns
basis = empty
for every free column f:
vector x has x[f] = 1
use RREF rows to recover every pivot coordinate of x
append x to basis
for vertex v:
X[v] = bitmask of basis indices k with basis[k][v] == 1
if some X[v] == 0: output No
else: output Yes and all X[v]
完整 GNU C++17 参考实现:AtCoder-abc366_g.cpp
N=60 时最高使用位为 59,1ULL<<59 合法;不要用有符号 1LL<<60 处理边界。CodeForces-1101G Zero XOR Subset 把 XOR 线性无关转成线性基;线性基更适合在线插入和最大 XOR,高斯矩阵更适合显式方程与恢复解。
用枚举所有 $2^n$ 变量对拍 XOR 消元;模 7 题随机生成解再造方程,核对恢复。调试优先打印 rank、主元列和矛盾行,而不是只看最终答案。