4078: 练5.7 约瑟夫问题

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:7 解决:2

题目描述

N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;…输出依次出圈的人的编号。

输入

输入N和M。

输出

输出一行,依次出圈的人的编号。

样例输入 复制

8 5

样例输出 复制

5 2 8 7 1 4 6 3

提示

n,m=input().split() #共n人,报到m出圈
n=int(n)
m=int(m)
a=[False]*(n+1) #设置一个列表a[0..n],列表元素的初值是false
f,t,s=0,0,0
while f!=n: #直到所有的人都出圈为止
    t+=1 #逐个枚举圈中的所有位置
    if t==n+1: #列表模拟环状,最后一个与第一个相连
        t=1
    if a[t]==False: #第t个位置上有人则报数
        s+=1
    if s==m: #当前报的数是m
        s=0  #计数器清零
        print(t,end=' ') #输出出圈人的编号
        a[t]=True #此处的人已出圈,设置为空
        f+=1 #出圈的人数增加一个