今天闲着无聊整理下《具体数学》中关于约瑟夫问题的讨论。
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(