幸存者游戏

有n个同学围成一圈,其id依次为1~n(n号挨着1号)。

现在从1号开始报数,第一回合报到m的人就出局,第二回合从出局的下一个人开始报数,报到m2的同学出局。

以此类推,直到最后一个回合报到mn−1的人出局,剩下最后一个同学。

输出这个同学的编号。

输入格式
共一行,包含两个整数n和m。

输出格式
输出最后剩下的同学的编号。

数据范围
n≤15,m≤5
输入样例:
5 2
输出样例:
5`

inn=list(map(int,input().split()))
n,m=inn[0],inn[1]
N=16
def helper(n,m):
    st=[0]*N#初始状态
    p=1#当前一号位置
    r=n#当前这一圈剩余的人
    i=1
    #迭代n
    while i<=n:
    	#当前报到m的i次方,应该被删掉
        k=1#用k表示m的i次方,踢掉的人
        for j in range(1,i+1):
            k=k*m%r#超过一圈之后,求余数
        #当余数为零的时候,表示剩余最后一个人
        if k==0:
            k=r
        #从下一个位置开始,把第k个没有被删掉的人删掉
        while True:
            if not st[p]:
                k-=1
                if not k:
                    st[p] = 1
                     # print(p)
                    break
            p+=1
            if p > n:
                p = 1
            # print(p)
        i +=1
        r -=1   
    return p

print(helper(n,m))


猜你喜欢

转载自blog.csdn.net/lgy54321/article/details/94455460
今日推荐