约瑟夫问题

来源:互联网 发布:全国手机号码数据库 编辑:程序博客网 时间:2024/06/05 00:56

约瑟夫问题

问题描述:有1到n共n个人围成一个环,从1开始每数2个退一个,求最后剩下的那个人的编号

例如:1、2、3、4、5 退出的顺序为2、4、1、5、3,即最后剩下3

假如初始我们有2n个人,在第一轮完成之后,我们剩下1、3、5、7...2n-3、2n-1

接下来要退出的就是3,这个过程和初始有n个人非常像,不同的是这个过程每个人的编号变成了2n-1

假设f(n)表示初始n个人时最后剩下的人的编号,由上可以得到

f(2n) = 2f(n) - 1  (n >= 1)

另一种情况,假如初始有2n+1个人,当2n退出时,接下来编号1的人会退出,剩下n个数为:

3、5、7、9...2n-1、2n+1

又得到了类似的情况,不过这次相对应的编号是2n+1

所以得到:f(2n+1) = 2f(n) + 1 (n >= 1)

由上可得:

(1) f(1) = 1

(2) f(2n) = 2f(n) - 1

(3) f(2n + 1) = 2f(n) + 1

由此可以得到

n    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

f(n) 1 1 3 1 3 5 7 1 3 5  7  9  11 13 15 1

可以发现按2的幂可以将数据分组1、2 ~ 3、4 ~ 7、8 ~ 15...

再对照f(n)可以得到

f(2^m + k) = 2k + 1 (m >= 0 & 0 <= k < 2^m) (PS:如果2^m <= n < 2^(m + 1),k = n - 2^m, 0 <= k < 2^m)

证明:

首先f(2^m) = 1,有f(2n) = 2f(n) - 1可得

令n = 2^m + k,当执行k次退出后,剩下2^m个人,这些人中第一个人即为最终留下来的,编号为2k + 1

得证

另外

设n用二进制表示n = (bmbm-1...b1b0)2 其中bm = 1

由于n = 2^m + 1 则:

k = (0bm-1...b1b0)2

2k = (bm-1...b1b00)2

2k + 1 = (bm-1...b1b01)2

f(n) = (bm-1...b1b0bm)2

由此可知:f(n) 即整数n的二进制表示循环左移一位

源自:具体数学

POJ 1781 可以用此方法做


原创粉丝点击