其实该题本身算是约瑟环的一个转换。。
问题描述是这样的。。
有n个人,站成一个圆圈。给你两个数k,m。。首先请第m个人出列,然后从m+1开始数数1-k,数到k的人出列,,最后会留下只剩下一个人。让你求出这个人的编号是什么。。
第一呢。我们转换下思路。。
先让n个人编号为(0--n-1),编号m-1的人出列。
于是可以得到剩余n-1个人序列。
m m+1 .....n-1 0 1.....m-2
我们也将它编号
m m+1 .....n-1 0 1.....m-2
0 1 .................n-2
于是这个问题便转换成了一个约瑟夫环问题。。问题规模为(n-1)
假如我们知道(n-1)规模问题的解 为编号x,则我们可以根据上述编号对应关系求得n规模问题的解x1=(m+x)%n
当然最后结果呢应该+个1 想必大家都明白 哈哈
关于约瑟夫环的问题可以根据以下求解:
问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始): k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2并且从k开始报0。现在我们把他们的编号做一下转换:k --> 0k+1 --> 1k+2 --> 2......k-2 --> n-2k-1 --> n-1变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n个人情况的解吗?!!变回去的公式很简单,相信大家都可以推出来:x=(x+k)%n如何知道(n-1)个人报数的问题的解?对,只要知道(n-2)个人的解就行了。(n-2)个人的解呢?当然是先求(n-3)的情况 ---- 这显然就是一个倒推问题!
显然得到递推公式
F[0]=0;
F[n]=(F[n-1]+k)%n