约瑟夫环
规则
N个人围成一圈,从1开始报数,杀掉报到M的人。下一个人接着从1开始报数。
公式
f ( N , M ) = ( f ( N − 1 , M ) + M ) f(N,M)=(f(N−1,M)+M)%N f(N,M)=(f(N−1,M)+M)
- f ( N , M ) f(N,M) f(N,M)表示,N个人报数,每报到M时杀掉那个人,最终胜利者的编号
- f ( N − 1 , M ) f(N-1,M) f(N−1,M)表示,N-1个人报数,每报到M时杀掉那个人,最终胜利者的编号
推导
上一次:从下标0开始报数。下标0喊1,下标(M-1)喊M淘汰,从下标M重新开始。
下一次:下标M成为下标0。
举例:11个人排成一排,假设每报到3的人被杀掉。
- f ( 1 , 3 ) f(1,3) f(1,3):只有1个人了,那个人就是获胜者,他的下标位置是0
- f ( 2 , 3 ) = ( f ( 1 , 3 ) + 3 ) % 2 = 3 % 2 = 1 f(2,3)=(f(1,3)+3)\%2=3\%2=1 f(2,3)=(f(1,3)+3)%2=3%2=1:在有2个人的时候,胜利者的下标位置为1
- f ( 3 , 3 ) = ( f ( 2 , 3 ) + 3 ) % 3 = 4 % 3 = 1 f(3,3)=(f(2,3)+3)\%3=4\%3=1 f(3,3)=(f(2,3)+3)%3=4%3=1:在有3个人的时候,胜利者的下标位置为1
- f ( 4 , 3 ) = ( f ( 3 , 3 ) + 3 ) % 4 = 4 % 4 = 0 f(4,3)=(f(3,3)+3)\%4=4\%4=0 f(4,3)=(f(3,3)+3)%4=4%4=0:在有4个人的时候,胜利者的下标位置为0
- …
- f ( 11 , 3 ) = 6 f(11,3)=6 f(11,3)=6