问题描述
n n n 个人站成一圈,编号为 1... n 1...n 1...n 。从 1 号开始,数到第 m m m 个人,淘汰。再从 m + 1 m+1 m+1 号开始,再数到第 m m m 个人,淘汰。以此类推,直到剩下最后一个人。求最后一个人的编号。比如,当 n = 8 , m = 3 n=8, m=3 n=8,m=3 时,如图所示。
淘汰的顺序依次为:3、6、1、5、2、8、4。最后剩下的人编号为 7。注意,可能会存在 m > n m>n m>n 的情况。
递推关系推导过程
设 J ( n , m ) J(n, m) J(n,m) 为 n n n 个人每次淘汰第 m m m 个人时剩下的编号,如上例有 J ( 8 , 3 ) = 7 J(8,3)=7 J(8,3)=7 。
当 n ≥ m > 1 n \geq m>1 n≥m>1 时,设 n = p m + k , n=pm+k, n=pm+k,其中 p p p 为 n n n 除以 m m m 的商, k k k 为余数,即有 p = ⌊ n m ⌋ , k = n mod m . p=\left\lfloor\frac{n}{m}\right\rfloor,\quad k=n\text{ mod } m. p=⌊mn⌋,k=n mod m.
在第一圈,淘汰的人编号依次为 m , 2 m , . . . , p m m,2m,...,pm m,2m,...,pm ,共 p p p 个,如图(红色标记)。
淘汰完这 p p p 人,剩余 p ( m − 1 ) + k p(m-1)+k p(m−1)+k 人,记为 q q q 。在这剩下的 q q q 个人中,从 p m + 1 pm+1 pm+1 号开始重新编号 1 到 q q q ,每 m m m 个人淘汰一位,便转化为一个子问题 J ( q , m ) J(q,m) J(q,m)。再找到新编号与旧编号的关系,即可找到递推关系,如图所示,蓝色为新编号。
编号的对应关系可以分成 p + 1 p+1 p+1 组,前 p p p 组各有 m − 1 m-1 m−1 个对应关系,最后一组有 k k k 个对应关系,如表格所示。
组号 | 1 | 2 | … | p | p+1 |
---|---|---|---|---|---|
原编号 | 1 , ⋯ , m − 1 1,\cdots, m-1 1,⋯,m−1 | m + 1 , ⋯ , 2 m − 1 m+1,\cdots,2m-1 m+1,⋯,2m−1 | … | ( p − 1 ) m + 1 , ⋯ , p m − 1 (p-1)m+1,\cdots,pm-1 (p−1)m+1,⋯,pm−1 | p m + 1 , ⋯ , p m + k pm+1,\cdots,pm+k pm+1,⋯,pm+k |
新编号 | 1 + k , ⋯ , m − 1 + k 1+k,\cdots,m-1+k 1+k,⋯,m−1+k | m + k , ⋯ , 2 m − 2 + k m+k,\cdots,2m-2+k m+k,⋯,2m−2+k | … | ( p − 1 ) m − ( p − 1 ) + 1 + k , ⋯ , p m − p + k (p-1)m-(p-1)+1+k,\cdots,pm-p+k (p−1)m−(p−1)+1+k,⋯,pm−p+k | 1 , ⋯ , k 1,\cdots,k 1,⋯,k |
为了更容易地找到对应关系,可以把原编号和新编号的 1 1 1 号对齐,具体的操作方法是将 q q q 个新编号围成的圈顺时针旋转 k k k 个距离,形成一个临时编号,记为 R ( q , m ) R(q, m) R(q,m) ,同时将新编号记为 J ( q , m ) J(q, m) J(q,m) ,原编号记为 J ( n , m ) J(n, m) J(n,m) ,得到新的对应关系,如表格和图所示,绿色为临时编号,蓝色为新编号。
组号 | 1 | 2 | … | p | p+1 |
---|---|---|---|---|---|
J ( n , m ) J(n, m) J(n,m) | 1 , ⋯ , m − 1 1,\cdots, m-1 1,⋯,m−1 | m + 1 , ⋯ , 2 m − 1 m+1,\cdots,2m-1 m+1,⋯,2m−1 | … | ( p − 1 ) m + 1 , ⋯ , p m − 1 (p-1)m+1,\cdots,pm-1 (p−1)m+1,⋯,pm−1 | p m + 1 , ⋯ , p m + k pm+1,\cdots,pm+k pm+1,⋯,pm+k |
R ( q , m ) R(q, m) R(q,m) | 1 , ⋯ , m − 1 1,\cdots, m-1 1,⋯,m− |