首先一开始的序列
序列1: 1, 2, 3, 4, …, n-2, n-1, n
此时出队列的第一个人,位置为k,号码肯定是m%n。这个应该没有问题,也就是取余操作使得数组类似能够有循环的功能。
此时序列2: 1, 2, 3, 4, … k-1, k+1, …, n-2, n-1, n
此时k出队列,序列2中为n-1个人了。
根据序列2,得到序列3:
k+1, k+2, k+3, …, n-2, n-1, n, 1, 2, 3,…, k-2, k-1
从序列2得到序列3很简单,也就是将k+1作为开始,然后将1连到n的后面,其实只是位置的不同,但是本质两个序列是一样的。所以同样,这里也是n-1个元素。
序列3可以映射得到序列4:
1, 2, 3, 4, …, 5, 6, 7, 8, …, n-2, n-1
这里我就乱掉了,这个映射是可以做,但是映射关系是怎样的?
OK,先不管映射关系,我们继续来推导。
对于序列4,我们假设能够得到解,也就是最后一个退出的人的号码,设置为x。如果我们能够通过映射关系,将x在序列3中对应的号码x’求出来,那我们就可以得到序列3的解,因为序列3其实和序列2是同一个,所以序列2的解我们也就得到了,序列2就是序列1去掉一个k,这个k对于序列1的解没有任何影响,所以序列1的答案就是求出来的x’。
x'有两种情况 即x'=x-k 或者 x'>n时 x'=(n+x)-k 因此 x=(x'+k)%n;
所以可以递推为f(i)=(f(i-1)+k)%n;