约瑟夫环问题数学解法

1.简介

问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。

2.思路

1.一共n个人,编号为(0~(n-1)),设最后的胜利者为本次编号y的人
2.第一次报完数后剩下n-1个人,我们把编号重新排列为(0~(n-2)),设最后的胜利者为本次编号为x的人
3.我们可以知道,1中的胜利者y和2中的胜利者x是同一个人
4.由3可以得到, y =( x + m ) % n
5.由以上可以得到递推公式

f(1) = 0

f(i) = (f(i-1) + m) % n

其中n为参加游戏的总人数,m为第m个报数,i为当前剩余人数,f(i)为最后一个人的编号

当n为6,m为2时,可得递推表格

nm胜利者编号(从0开始)编号
62设为y y = (x+m)%n40 1 2 3 4 5
52设为x20(2) 1(3) 2(4) 3(5) 4(0)
42(2+2)%400 1 2 3
32(0+2)%320 1 2
22(0+2)%200 1
12000

3.python代码

def josephus(n,m):
    if n < 2:
        return 0
    f = [0] * (n+1)
    # 注意编号从0开始
    f[1] = 0
    for i in range(2,n+1):
        f[i] = (f[i-1] + m) % n
    return f[n]

print('answer is: ',josephus(41,3))

4.总结

约瑟夫环递推公式:

f(1) = 0

f(i) = (f(i-1) + m) % n

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值