这是一份双拼零食。前半杯问“很多开关怎样一起满足条件”,后半杯问“两个不同周期什么时候再次对齐”。它们表面不像,骨子里都在做一件事:保留约束、消掉多余自由度。
学完后,你能:
前置:方程、模运算、XOR、最大公因数。
这节分成两个工作台。开关台上,x_i=0/1 不是抽象字母,而是“第 i 个开关按/不按”;每一行方程是一盏灯的要求。时钟台上,x≡a (mod m) 不是公式,而是“从 a 开始每隔 m 出现一次”的时间点列。
每次变形都要写一张收据:变形前哪些答案可行,变形后是否恰好还是这些答案?不能回答这句时,先不要做下一步消元或合并。
令 x1,x2,x3 表示三个开关是否按。要求是:
$$ x_1\oplus x_2=1,\qquad x_2\oplus x_3=0. $$
请列出 000 到 111 的八种按法,先筛第一条约束,再筛第二条。把留下的按法写出来。
停顿 0:如果变成 30 个开关,枚举从哪里爆炸?两条方程里哪一个变量出现了两次、可能被消掉?
给第一行取一组满足它的值,给第二行也取同一组值。若两行都成立,把等式左右各 XOR 一次,结果一定成立吗?反过来,若第一行与“第一 XOR 第二行”成立,能否再 XOR 第一行恢复第二行?
停顿 1:这两句构成了什么样的双向证明?为什么它比“消元看起来合理”更可靠?
把三行写成增广矩阵:
1 1 0 | 1
0 1 1 | 0
1 0 1 | 1
先在第 1 列找一个 1 当主元,再用它 XOR 掉第 3 行第 1 列;随后处理第 2 列。每处理一列,在纸上圈出一个“首次独立约束”。
停顿 2:最后若出现
0 0 0 | 1,它翻译成什么人话?若某列从头到尾没主元,哪个变量得到什么自由?
写两行时间:
x ≡ 1 (mod 4): 1, 5, 9, 13, ...
x ≡ 3 (mod 6): 3, 9, 15, ...
请圈出第一次相交,再写出下一次相交。然后把第一个条件写成 x=1+4t,代入第二个条件。
停顿 3:为什么不必继续从 0、1、2、3……逐个试?新变量 t 代表什么动作?
比较:
$$ x\equiv1\pmod4,\ x\equiv3\pmod6 $$
与:
$$ x\equiv1\pmod4,\ x\equiv2\pmod6. $$
请分别把两边对 2 的余数写出来。为什么第一对有机会、第二对永远无机会?
| 工作台 | 原始暴力对象 | 新状态/摘要 | 合法变形 | 最终判断 |
|---|---|---|---|---|
| 开关 | ||||
| 时钟 |
有 $n$ 个开关时,“按/不按”已有 $2^n$ 种组合;有两个周期很大的时钟时,从 0 开始逐个试时间也可能要等很久。两类暴力都在重复探索同一个约束空间。我们要学会合并约束,而不是逐个候选试探。
令 $x_i\in{0,1}$ 表示第 $i$ 个开关是否按。某盏灯被若干开关影响,要求最终翻成目标状态,就是这些 $x_i$ 的 XOR 等于 0 或 1。例如:
$$ x_1\oplus x_2=1,\qquad x_2\oplus x_3=0. $$
两条方程 XOR 在一起相当于“左右两边同时加同一式子”,解集不变,却能消掉共同变量。交换方程、用一行 XOR 另一行,都是不改变解集的合法行变换。
row = 0
for each column col:
find a row p >= row with matrix[p][col] = 1
if no p: this variable is free; continue
swap matrix[p], matrix[row]
for every other row r with matrix[r][col] = 1:
matrix[r] = matrix[r] XOR matrix[row]
row += 1
rank = row
若得到 0 = 1,无解;若相容且秩等于变量数,每个变量被钉死;若秩较小,有自由变量。XOR 域里非零主元永远是 1,不需要除法。
要合并:
$$ x\equiv a\pmod m,\qquad x\equiv b\pmod n, $$
从第一个条件出发,所有候选写成 $x=a+mt$。代入第二个条件,得到:
$$ mt\equiv b-a\pmod n. $$
若 $g=\gcd(m,n)$ 不整除 $b-a$,两只时钟永远错开;若能整除,先除以 $g$,此时 $m/g$ 与 $n/g$ 互质,可用扩展欧几里得找到 $m/g$ 在模 $n/g$ 下的逆元,解出 $t$。
merge(a mod m, b mod n):
g = gcd(m, n)
if (b - a) % g != 0: return impossible
solve t = ((b-a)/g) * inverse(m/g mod n/g) mod (n/g)
x = a + m * t
return x mod lcm(m,n), lcm(m,n)
先对增广矩阵做两步:R3 ^= R1,再用第 2 行消去第 1、3 行的第 2 列。每步写下矩阵与“为什么解集不变”。然后合并 1 mod 4 与 3 mod 6:
| CRT 阶段 | 式子 | 得到的信息 |
|---|---|---|
| 参数化 | x=1+4t |
|
| 代入第二条件 | ||
| gcd 兼容性 | ||
| 解出 t | ||
| 新余数/模数 |
反复合并就得到中国剩余定理(Chinese Remainder Theorem, CRT)的多条件版本。互质只是最常见的简化情况,不是非互质时可以假装不存在的细节。
高斯消元中,一行代表一个约束;合法行变换不增不减满足全部约束的变量赋值。CRT 中,一个同余代表一串等间隔候选;合并后返回的是同时满足两串候选的更稀疏序列。两者都能用“新表达和旧表达等价吗”检查正确性。
XOR 消元若有 $e$ 条方程、$v$ 个变量,朴素复杂度约 $O(ev\min(e,v))$;位集优化可加速整行 XOR。逐步 CRT 的整数乘法可能溢出,模数累乘前要确认题目范围或使用更宽整数。
%。rank 猜无解。[0, modulus);负的 % 在 C++ 里需要修正。运行 开关与错开的时钟.py。选 x 会显示每次选主元和 XOR 消元后的矩阵;选 c 会逐步合并两组同余,并显示 gcd 兼容性检查。
请先预测预设 CRT 中 $x\equiv1\pmod4, x\equiv3\pmod6$ 的最小非负解,再让程序验算每个余数;再把第二个余数改成 2,看看冲突在哪一步暴露。
高斯消元会通向解空间、线性基和图的环空间;CRT 会通向周期事件、模方程和状态压缩。二者都只在相应代数结构中正确:模合数下不是每个非零数都有逆元,带负权图也不是线性方程——不要给每个困难问题都套一副代数眼镜。
(b-a) % gcd(m,n) 检查到底比较了什么?0=1,辨认无解。