今天闲着无聊整理下《具体数学》中关于约瑟夫问题的讨论。
n 个人围成一圈,从
1 到 n 标号,每隔一个人处死一个人,求最后幸存下来的人的编号,例如n=10 ,则被杀的人按顺序依次是:
2,4,6,8,10,3,7,1,9
当然可以直接模拟杀人的过程直到剩下最后一个,但这种方法不够快。
可以考虑递归做法,如果杀了一圈,那么这个时候我们可以把剩下的人从 1 开始重新排列,这样如果能够找到两次排列的编号关系,就可以用递归来解决了。
假设
以 n=10 为例,
杀之前: [1,2,3,4,5,6,7,8,9,10]
杀之后: [1, ,2, ,3, ,4, ,5, ]
其中空出来的表示在这轮中阵亡的。
可以很轻松的发现这两者之间的关系( ∗2−1 ),因此我们可得:
假设 J(n) 为 n 个人的约瑟夫环最后剩下的幸存者的编号,因此有
J(2n)=2J(n)−1
同理如果是奇数呢
以 n=9 为例,
杀之前: [1,2,3,4,5,6,7,8,9]
杀之后: [ , ,1, ,2, ,3, ,4]
其中空出来的表示在这轮中阵亡的。
因此,我们也可以得到他们之间的关系:( ∗2+1 ),所以有:
J(2n+1)=2J(n)+1
因此合起来我们可以得到递推式:
J(2n)=2J(n)−1
J(2n+1)=2J(n)+1
当 n=1 时,则有 J(n)=1
接下来求 J(n) 的闭形式:
根据 J(2n)=2J(n)−1 ,且 J(1)=1 可得, J(2m)=1 恒成立,因此假设对于所有的数都能表示为 2m+l , 0≤l<2m ,则有
J(