沃瑟夫问题
有 n 个人排成一圈,从 1 到 n 编号。从第一个人开始依次报数(第一个人报的数是 1,下一个人报的数是 2...,当前这个人报的数字等于前面那个人报的数字加一),报数一共进行 n 轮,对于第 i (1<=i<=n) 轮,数到 i^2 的人出列,下一个人继续从 1 开始报数。结束的时候所有人都会出列。
请依次输出每一轮出列的人的编号。
输入格式
第一行一个整数 n
输出格式
输出一行,包含 n 个数,表示每一轮出列的人的编号
样例输入
10
样例输出
1 5 6 8 9 10 2 3 4 7
数据规模
对于 100% 的数据,保证 1≤n≤5000。
以下是我的代码
但是超时了,帮帮我怎样才能优化一下qwq
#include <iostream>
using namespace std;
const int size = 5010;
int n, m, q[size + 1], front = 1, rear = 0;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
rear = (rear + 1) % size;
q[rear] = i;
}
int x = 0, k = 1;
while (front != (rear + 1) % size) {
int y = q[front];
front = (front + 1) % size;
x++;
m = k * k;
if (x == m) {
printf("%d ", y);
x = 0;
k++;
} else {
rear = (rear + 1) % size;
q[rear] = y;
}
}
return 0;
}