约瑟夫环
一共有 \(1\backsim n\) 这些点,组成首尾相接的环。从 \(1\) 号点开始报数(报数编号依次加 \(1\),从 \(1\) 开始报),报到 \(k\) 的点就删除,然后再从下一个点重新开始报数。计算最终会剩下的点的编号。
我们称最终剩下的那个人为存活者。
做法:采用倒推的方式。最终情形一定是:只剩下一个点,这个点就是存活者。对于任意一种大小为 \(n\) 的情形,我们规定该种情况的一种新编号模式:从上一轮(剩 \(n + 1\) 个人)被删除的点的下一个点开始,编号为 \(1\),往后依次报数。
现在我们尝试使用 剩 \(n\) 个点时存活者在新编号模式下的编号 递推 剩 \(n + 1\) 个点时存活者在新编号模式下的编号。设 \(f(n)\),即 \(f(n) \rightarrow f(n + 1)\)。由于 \(f(1) = 1\) 已知;且 \(n\) 为初始值 \(N\) 时,就是从第一个人开始报数的,因此 \(f(N)\) 就是我们要求的答案。因此我们只要解决了 \(f(n) \rightarrow f(n + 1)\),便解决了整个问题。
而对于剩 \(n + 1\) 个点与剩 \(n\) 个点 两种情形,我们会发现:剩 \(n + 1\) 个点时,被删除点的报数为 \(k\),那么它的下一个点,也就是在接下来剩 \(n\) 个点时报数为 \(1\) 的点,在本轮中理应报数 \(k + 1\)。后续点也依此类推(剩 \(n\) 个点时报数为 \(i\) 的点,在上一轮剩 \(n + 1\) 个点时报数理应为 \(k + i\))。这就可以理解为:剩 \(n + 1\) 个点相对于剩 \(n\) 个点的情形,每个点都循环后移了 \(k\) 位。那么,存活者在剩 \(n + 1\) 个点时,新编号模式下的编号相对于剩 \(n\) 个点的情形,也会循环后移 \(k\) 位,也就是:
于是,通过递推 \(f_{i}\),我们就可以 \(O(n)\) 解决约瑟夫环问题。

浙公网安备 33010602011771号