能力值:
( LV2,RANK:10 )
|
-
-
2 楼
为了便于描述算法,这里将总人数设为n(编号0-(n-1),设从0开始报数),退出数字设为m,
报到x1=(m-1)的人退出,因为有可能m>n,所以把x1=(m-1)变形为x1=((m-1)mod n)。
当第一个人出列之后剩下的n-1个人组成了一个新的圆圈,编号从k1=(m mod n)开始,所有编号减去k1后,继续从0开始报数。
新的圆圈为0,1,2,3,……,n-3,n-2。
于是问题变成了(n-1)个人报数的子问题,同上退出的人的编号为x2=((m-1)mod (n-1)),所有编号减去k2=(m mod (n-1))
新的圆圈为0,1,2,3,……,n-4,n-3。
于是问题变成了(n-2)个人报数的子问题,同上退出的人的编号为x3=((m-1)mod(n-2)),所有编号减去k3=(m mod (n-3))
…………
直到最后剩下两个人,退出的人的编号x=(m-1)mod 2,则最后剩下的人的编号为K(n-1)=m mod 2
将K(n-1)还原为原数列的编号,K(n-1)= k1 + k2 + k3 + ……+K(n-1)
|
|
|