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个元素作为新的一轮的第一个元素。利用号这一点,从下一轮推上一轮即可。
递推公式将变为:f(n, k) = (f(n-1, k) -1 + k) % n + 1