Skip to content
Go back

二进制思维——从毒药白鼠到分金块的编码艺术

二进制思维:10 只老鼠如何找到 1000 瓶中的毒药?

一句话结论(30s)

结论先行:10 只老鼠能在 1 周内从 1000 瓶里找出毒药,因为每只老鼠的”死/活”是一个二进制位,10 位可编码 2¹⁰=1024 种状态 > 1000。本质是二进制编码——用 N 个二态单元表示 2^N 种状态,让信息压缩比最大化,毒药白鼠、分金块、Nim 游戏三题同构。

核心原理(2min)

毒药白鼠:把 1000 瓶编号转 10 位二进制,第 i 只老鼠喝所有第 i 位为 1 的瓶子,一周后按死亡老鼠还原毒药编号——每只老鼠是”二进制探针”。分金块:切 1/7、2/7、4/7 三份(二进制权重 1、2、4),可组合出 1~7 所有整数。Nim 游戏:所有堆异或 XOR=0 则先手必败,否则先手必胜,因为非平衡态总存在一手使 XOR 归零,XOR 是复杂博弈的简洁表征。三者都靠”信息空间大小决定策略可行性”这一共性。

底层深入(5-10min)

毒药白鼠:二进制编码

1000 瓶液体中 1 瓶是毒药(饮用后一周内死亡),有 10 只老鼠,1 周时间,找到毒药瓶。

直觉失败:1000 瓶 → 老鼠死/活是二态 → 10 只老鼠能编码 $2^{10} = 1024$ 种状态 > 1000 → 够了。

做法

  1. 将 1000 瓶编号 1~1000,转为 10 位二进制
  2. 第 $i$ 只老鼠喝所有第 $i$ 位是 1 的瓶子
  3. 一周后,死亡老鼠对应位为 1,存活对应位为 0 → 还原出毒药瓶编号
例如: 死亡老鼠 = [0, 2, 5, 7] → 二进制某位被这些老鼠覆盖 = 毒药编号的第0,2,5,7位是1

本质:每只老鼠是一个”二进制探针”,用它们的生死状态编码 10 bit 信息,覆盖 1024 种可能性。

💭 思考:为什么第 i 只老鼠要喝”所有第 i 位为 1”的瓶子?——因为这样每只老鼠的生死就独立地”探测”编号的一位,一周后把死亡老鼠对应的位拼起来,就是毒药瓶的编号,一次并行实验完成全部探测。

分金块:二进制的”支付码”

7 天付工资,只能切 2 刀,每天恰好支付当天的份额。

切三份:$\frac{1}{7}$、$\frac{2}{7}$、$\frac{4}{7}$(二进制权重 1、2、4)。这三份可以组合出 1~7 的所有整数:

1 = 1/7
2 = 2/7
3 = 1/7 + 2/7
4 = 4/7
5 = 1/7 + 4/7
6 = 2/7 + 4/7
7 = 1/7 + 2/7 + 4/7

扩展:发 15 天工资,切三刀分四份 $\frac{1}{15}, \frac{2}{15}, \frac{4}{15}, \frac{8}{15}$ ——二进制覆盖 1~15。

💭 思考:为什么切 1/7、2/7、4/7,而不是平均切三份?——因为 1、2、4 是二进制权重,任取其一或多个相加能恰好凑出 1~7 的每一个整数;平均三份的粒度是 7/3,凑不出 1/7、2/7 这种细分,无法每天精确支付。

Nim 游戏:异或的魔法

N 堆石子,每次从任意一堆取任意数量,取最后石子者胜。

Sprague-Grundy 定理:计算所有堆的 XOR:

boolean canWin(int[] piles) {
    int xor = 0;
    for (int p : piles) xor ^= p;
    return xor != 0;
}

XOR 的深刻之处在于:每堆石子数量是关键,但只需一个异或运算就能判断全局胜负——复杂博弈的简单表征。

💭 思考:为什么 XOR=0 就必败?——因为平衡态下无论从哪堆取走多少,XOR 都会变为非 0,后手总能再取一次把它调回 0;而终局(全 0)也是 XOR=0,所以先手面对 XOR=0 只能把平衡让给后手,最终由后手拿走最后石子。

总结

二进制编码在智力题中的应用极为深刻:用 N 个二态单元(bit/老鼠/砝码/箱子)表示 $2^N$ 种状态,信息压缩比最大化。三题同构——信息空间大小决定了解决策略的可行性。

章末提问

追问 1:如果只有 8 只老鼠,最多能检测多少瓶?

回答思路:结论是最多 256 瓶,因为 8 只老鼠的生死状态只能编码 2^8=256 种不同模式,信息空间大小决定了可区分瓶数的上限。

追问 2:为什么第 i 只老鼠要喝”第 i 位为 1”的所有瓶子?

回答思路:结论是这样能把每只老鼠的生死独立映射到编号的一位——第 i 只老鼠死说明毒药编号第 i 位是 1,一周后把死亡老鼠的位拼起来即还原编号,一次并行实验完成全部探测。

追问 3:Nim 游戏为什么 XOR=0 时先手必败?

回答思路:结论是 XOR=0 是平衡态,任何一步取子都会破坏平衡(XOR 变非 0),后手总能找到一步把它调回 0;由于终局全 0 也是 XOR=0,先手永远只能把平衡让给后手,最终由后手拿走最后石子。


Share this post on:

Previous Post
提示词工程:System Prompt 怎么驯服模型
Next Post
Agent 的本质:LLM + Tool Loop