Skip to content

Latest commit

 

History

History
30 lines (24 loc) · 1.18 KB

README.md

File metadata and controls

30 lines (24 loc) · 1.18 KB

intro

1). 长度为n,编号从0到n-1的序列,首尾相连形成一个环
2). 每次从头到尾开始数,删除第k个元素(环形遍历)
3). 删除之后,将第k+1个元素看成第一个元素 4). 重复2)3)
问最后留下来的元素的初始编号是什么?

简单推导

  • f(n, k) 表示编号从0开始,长度为n,删除第k个元素的约瑟夫环最后留下来的元素编号是I(n)
  • 那么 f(n-1, k) = I(n-1)
f(n, k)    =>  0, 1, 2, 3, 4, .... n-1 
f(n-1, k)  =>  k, k+1, k+2, n-1, ..., 0, 1, 2, ..., k-2    <= 原来的编号
               0,   1,   2,  ..., k-1, ...,    n-1, n-2    <= 现在的编号

观察之后,f(n-1, k)中编号 0 逆推回 k 的公式就很明显了:

  • (0+k) % n = k
  • (n-2+k)%n = k-2
  • 一般的有: f(n, k) = (f(n-1, k) + k) % n
  • f(1, k) = 0

关键点在于删除第k个元素后,以第k+1个元素作为新的一轮的第一个元素。利用号这一点,从下一轮推上一轮即可。

如果是1-index

递推公式将变为:f(n, k) = (f(n-1, k) -1 + k) % n + 1

例题

  1. 1823. 找出游戏的获胜者