公式法:
F(N,M) = (F(N-1,M) + M) % N
F(1,M) = 0 (索引从0开始)
F是每一轮中存活的人对应的编号。
递推过程如下:
- 已知F(1,M) = 0,即只有一个人的队伍中,存活的肯定是编号0
- 从最后一轮F(1,M)求解倒数第二轮F(2,M):
倒数第二轮有两个人,杀掉一个人后剩余一人;
那对应的报号顺序为: 0 1 2 0,(最后一个0对应的存活的人,也就是最后一轮的编号)
实际报号顺序对应的编号是:0 1/ 0 1 (上下对应,最后剩的人对应编号为1.)
故倒数第二轮(0,1),剩余的是编号为1 - 倒数第三轮同理
报号顺序: 0 1 2 0 1(最后的0,1表示这轮之后存活的人,也就是倒数第二轮中人的编号)
实际编号: 0 1 2/ 0 1(这一轮实际有三个人,对应实际编号,最后剩余的人也是编号1)
故倒数第三轮(0,1,2),剩余的是编号为1 - 倒数第四轮
报号顺序: 0 1 2 0 1 2(最后的0,1,2表示这轮之后存活的人,也就是倒数第三轮轮中人的编号)
实际编号: 0 1 2 3/ 0 1(这一轮实际有4个人,对应实际编号,最后剩余的人也是编号1)
故倒数第三轮(0,1,2,3),剩余的是编号为0 - 倒数第五轮
报号顺序:0 1 2 0 1 2
实际顺序:0 1 2 3 4/ 0
故下一轮中这一轮中对应的是编号3
归纳可以得到结论,如果我们知道N-1个人中,最终剩余的人的编号,那么,就可以得到N个人最终剩余的编号
因为从N个人到N-1个人,一定经过了1次,0到M-1的报号,如图所示
红色的N-1个编号就是就是下一轮N-1个人的实际编号顺序,也可以与N中的编号相对应了。
所以N-1中幸存者编号对应N中幸存者编号就是:
F(N,M) = (F(N-1,M)+M)%N
来源:CSDN
作者:Chinesischguy
链接:https://blog.csdn.net/Chinesischguy/article/details/103753942