约瑟夫环问题

约瑟夫环运作如下:
1、一群人围在一起坐成[2]  环状(如:N)
2、从某个编号开始报数(如:K)
3、数到某个数(如:M)的时候,此人出列,下一个人重新报数
4、一直循环,直到所有人出列[3]  ,约瑟夫环结束
 
花了一个小时时间,总算明白了,赶紧写下来防止以后又忘了;
这里我们假定从编号1开始报数。首先我们可以确定的是,最后只剩下一个人时,他的编号为1。
我们要做一个递推公式,关于新编号和旧编号的关系。因为最后的情况已经确定,如果能知道该递推公式,
就可以从最后的编号1一直往前推。
 
首先看看旧编号和新编号的关系。
旧编号 (i个人)              新编号(i-1个人)
1                                   1
2                                   2
3                                   3
。。。                       。。。
s-1                                i-1
s                                    --
s+1                                1
s+2                                2
。。。                       。。。
 
假定旧编号为s的人出列,那么旧编号从s+1开始重新编号。
 
可以得到: 旧编号 = (新编号i-1+s-1)%i +1; (*)
 
式中s未知。但其实对i个人来说,从1开始报数,报到m出列的那个人的编号是可求的;
 
编号 = (报数-1)%i+1;
则 s=(m-1)%i+1;
 
代入式(*)可得:  旧编号 = (新编号i-1+m-1)%i +1;
 
至此,可以从最后的编号1开始,往前推到初始情况该人的编号。
posted @ 2017-08-23 17:30  贾斯彼迭  阅读(191)  评论(0)    收藏  举报