约瑟夫环运作如下:
2、从某个编号开始报数(如:K)
3、数到某个数(如:M)的时候,此人出列,下一个人重新报数
花了一个小时时间,总算明白了,赶紧写下来防止以后又忘了;
这里我们假定从编号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= (新编号
i-1+s-1)%i +1; (*)
式中s未知。但其实对i个人来说,从1开始报数,报到m出列的那个人的编号是可求的;
编号 = (报数-1)%i+1;
则 s=(m-1)%i+1;
代入式(*)可得: 旧编号
i= (新编号
i-1+m-1)%i +1;
至此,可以从最后的编号1开始,往前推到初始情况该人的编号。