| 时间限制 | 内存限制 | 
|---|---|
1000 ms | 
65536 KB | 
# 题目描述
在 Baymax 的糖果王国里,有  个糖果,每个糖果都有一个不同的味道。王国的官员 BBetula 和 CBetula 是糖果品鉴专家。他们喜欢进行一种特殊的游戏,游戏规则如下:
- 
将 个糖果摆成一个圆圈,每个糖果逆时针编号为 。
 - 
游戏将进行若干轮次,对于每个轮次,官员 BBetula 将从上一轮次结束时的位置开始 逆时针 数 个糖果,官员 CCBetula 将从上一轮次结束时的位置开始 顺时针 数 个糖果,且两个官员可能选中同一个糖果。接下来,被选中的 到 个糖果会被带离糖果王国,本轮次结束。
 - 
对于第一轮次,官员 BBetula 从第 个糖果开始,官员 CBetula 从第 个糖果开始。
 
轮次会一直进行,直到所有糖果都被带离糖果王国。作为糖果王国的智囊,请你求出糖果依次离开的顺序吧~
# 输入格式
一行,三个正整数 。保证 ,。
# 输出格式
输出若干行,每行分别为每一轮被带离王国的糖果的编号,若有两个糖果被带离,优先输出官员 BBetula 带离的糖果编号,两个数中间用一个空格分隔。
# 输入样例
10 4 3  | 
# 输出样例
4 8  | |
9 5  | |
3 1  | |
2 6  | |
10  | |
7  | 
# 样例解释
第一个轮次中,官员 BBetula 从第 个糖果的位置开始逆时针数 个糖果,到达第 个糖果的位置;官员 CCBetula 从第 个糖果的位置开始顺时针数 个糖果,到达第 个糖果的位置。在第二轮次中,官员 BBetula 将从第 个糖果的位置开始,官员 CCBetula 将从第  个糖果的位置开始,依此类推。
# 题解:环状链表
直接用一个环状链表模拟整个过程即可,但是实现时细节较多,具体见代码。
时间复杂度:。
参考代码:
#include <stdio.h> | |
int n, k, m, size;  | |
struct Node  | |
{ | |
int prev, next, id;  | |
} node[1010];  | |
void Init()  | |
{ | |
size = n;  | |
node[1].prev = n, node[1].next = 2, node[1].id = 1;  | |
node[n].prev = n - 1, node[n].next = 1, node[n].id = n;  | |
for (int i = 2; i < n; ++ i)  | |
    { | |
node[i].prev = i - 1;  | |
node[i].next = i + 1;  | |
node[i].id = i;  | |
    } | |
return;  | |
} | |
void Delete(int id)  | |
{ | |
node[node[id].prev].next = node[id].next;  | |
node[node[id].next].prev = node[id].prev;  | |
-- size;  | |
return;  | |
} | |
int main()  | |
{ | |
    // freopen("M.in", "r", stdin); | |
    // freopen("M.out", "w", stdout); | |
scanf("%d%d%d", &n, &k, &m);  | |
Init();  | |
int bInd = 1, cInd = n;  | |
while (size)  | |
    { | |
for (int i = 1; i < k; ++ i)  | |
bInd = node[bInd].next;  | |
printf("%d ", bInd);  | |
if (size)  | |
        { | |
for (int i = 1; i < m; ++ i)  | |
cInd = node[cInd].prev;  | |
if (cInd != bInd)  | |
printf("%d", cInd);  | |
        } | |
puts("");  | |
Delete(bInd);  | |
if (bInd == cInd) // 会进行两次 Delete,大小只能减 1  | |
++ size;  | |
bInd = node[bInd].next;  | |
Delete(cInd);  | |
if (bInd == cInd) // 说明 bInd 被拿走了,bInd 再往下移一格  | |
bInd = node[bInd].next;  | |
cInd = node[cInd].prev;  | |
    } | |
return 0;  | |
} |