约瑟夫环——递推公式

递推公式:
                                          f(N,M)=(f(N1,M)+M)%N

    • f(N,M)表示,N个人报数,每报到M时杀掉那个人,最终
    • f(N1,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

posted @ 2020-09-11 14:06  鑫勇是种信仰  阅读(551)  评论(0)    收藏  举报