题目描述
n 个人的编号是 1~n,如果他们依编号按顺时针排成一个圆圈,从编号是1的人开始顺时针报数。
(报数是从1报起)当报到 k 的时候,这个人就退出游戏圈。下一个人重新从1开始报数。
求最后剩下的人的编号。这就是著名的约瑟夫环问题。本题目就是已知 n,k 的情况下,求最后剩下的人的编号。
题目的输入是一行,2个空格分开的整数n, k
要求输出一个整数,表示最后剩下的人的编号。约定:0 < n,k < 1百万
例如输入:
10 3程序应该输出:
4资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
解题思路
没做过约瑟夫环这类题目,现学了一下。时间要求为1s,数据量为1e6,只能O(n)。
设f(n,k)为1-n个人每次去掉第k个人最终剩下的人的编号,可推导得到下式:
f(n,k)=(f(n-1,k)+k)%n
递归做法在这题里不行,得用高效的数组做法。
代码(未经检验,如有错误,欢迎指正)
n,k=int(input()),int(input())
#递归做法
# def f(n,k):
# if n==2:
# if k%2==0:
# return 1
# else:
# return 2
# else:
# s=(f(n-1,k)+k)%n
# if s==0:
# s+=1
# return s
# print(f(int(n),int(k)))
#数组做法
ans=1
if k%2==1:
ans+=1
for i in range(3,n):
ans=(ans+k)%n
if ans==0:
ans=1
print(ans)