题目

模拟约瑟夫环淘汰过程:n 个人围成一圈从 1 开始报数,报到 m 的人出列,直到所有人均出列,依次输出出列人员的原始编号。

输入格式:输入一行包含两个正整数 n m,以空格分隔。

输出格式:输出出列顺序,各编号之间以空格分隔,末尾换行。

数据范围与约定:1 ≤ n ≤ 500,1 ≤ m ≤ 500。

思路与算法

1. 环形模拟
使用布尔列表 alive 标记在场状态,下标通过 (i + 1) % n 环形递增。

2. 报数计数
仅当当前人员未被淘汰时报数计步,命中 m 时标记淘汰并输出。

完整程序

n, m = map(int, input().split())

# 环形模拟约瑟夫环出列
alive = [True] * n
left = n
i = 0
cnt = 0
order = []

while left > 0:
    if alive[i]:
        cnt += 1
        if cnt == m:
            order.append(str(i + 1))
            alive[i] = False
            left -= 1
            cnt = 0
    i = (i + 1) % n

print(" ".join(order))

运行示例

输入:

5 2

输出:

2 4 1 5 3