约瑟夫环数学问题——举一反三、触类旁通

约瑟夫环问题

故事背景

据说在罗马帝国时期,一群犹太士兵被罗马人包围,为了不当罗马人的俘虏,决定集体自杀。自杀的方式是第一个士兵会杀掉他左边的第二个士兵,同样第三个士兵会杀掉第四个士兵,第五个士兵会杀掉第六个士兵,依次类推,直到最后只剩下一个人。然后他再自杀,犹太士兵里有个人叫约瑟夫,他其实想投降保命,但又不敢明说,那么约瑟夫应该站在哪一个位置才能成为剩下的最后一个人?这样他就不用自杀,可以直接向罗马人投降。

在人数不多的情况下,这个问题很好推测:

  • 假设有10个人,1->2,3->4,5->6,7->8,9->10,只剩下1、3、5、7、9
  • 接下来就是1->3,5->7,9->1,只剩下5、9
  • 最后5->9,所以站在5号位置就能存活

但如果士兵有100人?1000人呢?约瑟夫没有那么多时间提前推算。
这里先把士兵的人数和对应能存活的位置整理成图表。

士兵总人数存活的位置
11
21
33
41
53
65
77
81
93
105

我们从里面发现一些规律,首先能活下来的都是奇数,因为最先杀人的士兵都处在奇数位置,所以不管总人数多少,最先死掉的肯定是站在偶数位置上的人,也就是说约瑟夫绝对不能站在偶数位置上。

第二点我们发现图表里多次出现1,也就是士兵1最后会存活的情况,这些1对应的士兵总人数恰好是2的n次方。比如4是2的2次方,8是2的3次方。

我们来分析下这个规律:

  • 假设士兵总人数是8,也就是2的3次方
  • 第一轮杀完,偶数位置上的人都死掉了,去掉死人重新标位置
  • 第二轮还是士兵1先动手,仍然是偶数位置上的人都死了,再把他们去掉重新标位置
  • 第三轮同样是偶数位置上的人死掉,剩下的就是1号士兵
  • 按照这个逻辑,哪怕士兵总人数有2的100次方,经过无数轮搏杀后,最后剩下的还是士兵1。也就是说“如果士兵总人数是2的n次方情况下,最后存活下来的一定是士兵1。”这一点就是赢得这个游戏的关键
  • 再比如士兵总人数有19人,19不是2的n次方,但可以把19写成19=3+2^4,像刚才说的,在2的n次方部分,存活的一定是士兵1,也就是最先动手的那个人。所以我们只需要看前面的这个3,可以理解成先排除多余的这3个人,1->2,3->4,5->6,把2、4、6这三个人排除掉,然后再重新标识位置,这时候总人数变成16人。也就是2的4次方,按照刚才找到的规律:“在士兵总人数是2的n次方情况下,最后存活下来的一定是士兵1。”所以这个士兵1其实就是原来的士兵7。所以不用再去数,我们直接猜在19个人的情况下最后存活的就是士兵7

有了这个简单的计算办法,不管总人数是多少都能很快的算出来。比如总人数是38,可以写成38=6+2^5,然后再去数等6个人死后,该第几个人动手,那么这个人就是最后的赢家。

接下来将这规律整理成数学公式:

x=a+2^n//x是总人数
y=2a+1//y是最后存活的位置

在原来的士兵里,犹太士兵共有41个,把它带进这个公式里41=9+2^5,y=2*9+1=19,所以约瑟夫站在19号位置。最后活了下来,这就是著名的“约瑟夫环”数学问题。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

༄༊心灵骇客༣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值