约瑟夫环——递推公式
递推公式:
f(N,M)=(f(N−1,M)+M)%N
- f(N,M)表示,N个人报数,每报到M时杀掉那个人,最终
- f(N−1,M)表示,N-1个人报数,每报到M时杀掉那个人,最终胜利者的编号
-
现在假设有10个人,报到3的人就会被杀掉,我们用数字给这十个人编号为
1 2 3 4 5 6 7 8 9 10
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 4 | 5 | 6 | 7 | 8 | 9 | 10 | 1 | 2 | |
| 7 | 8 | 9 | 10 | 1 | 2 | 4 | 5 | ||
| 10 | 1 | 2 | 4 | 5 | 7 | 8 | |||
| 4 | 5 | 7 | 8 | 10 | 1 | ||||
| 8 | 10 | 1 | 4 | 5 | |||||
| 4 | 5 | 8 | 10 | ||||||
| 10 | 4 | 5 | |||||||
| 10 | 4 | ||||||||
| 4 |
第·一行绿色那行是数组下标,第二行是每个人的编号
现在逆向推导
- f(1,3):只剩最后一个人,胜利者的数组下标为0
- f(2,3)=(f(1,3)+3)%2=1,只有两个人的时候,胜利者下标为1
- 。。。。。。
- f(10,3)=3,因为我们数组下标是从0开始的,所以人的编号是下标+1,也就是4
那么这个公式是怎么推导的呢?
1.假设我们已经知道了10个人时,胜利者的下标为3,那下一次9个人时,胜利者的下标为多少?
其实就是10个人时杀掉了编号为3(即数组下标为2)的人后,后面的人都往前移动了3位,所以胜利者的下标由3变成了0
2.那我们倒过来我们知道9个人时,胜利者的下标为0,那10个人时胜利者的下标为多少?
其实这和上面的问题一样,这是这是上个问题的逆过程,就是把大家都往后移动3位,所以f(10,3)=f(9,3)+3,不过可能会出现数组越界所以要取模变成f(10,3)=(f(9,3)+3)%10
3.那么人数改为n报到m时就杀掉数组怎么移动呢
一样的,杀一人则后面的人的下标都往前移动m则,f(n,m)=(f(n-1,m)+m)%n
浙公网安备 33010602011771号