有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))