nn 个物体分别编号为 1,2,3,,n1,2,3,\dots,n,将这些物体排成一行。

定义一次操作 x op 为:

  • 如果 op=1\operatorname{op}=1,将编号为 xx 的物体与它左边的物体交换,如果 xx 已经在最左边,则不交换;
  • 如果 op=2\operatorname{op}=2,将编号为 xx 的物体与它右边的物体交换,如果 xx 已经在最右边,则不交换。

注意,编号为 xx 的物体 不是 当前位置为 xx 的物体。

能否在摆放前设计一条操作方案,使得无论如何摆放,标号为 mm 的物体一定能在有限步内移动到第 kk 个位置?如果能,输出操作方案。注意,你不需要最小化操作步数。

多测,n105\sum n \leqslant 10^{5},保证输入合法。

InputOutput
1
3 2 3
Yes
3
1 1
2 2
3 1

称原先三个物体为筷子、杯子和勺子,题目要求把第二个物体,即杯子,移动到第三个位置。答案是有解,需要三步:

  • 第一步:筷子和它左边的物品交换,如果筷子已经在最左边,就不需要移动。
  • 第二步:杯子和它右边的物品交换,如果杯子已经在最右边,就不需要移动。
  • 第三步:勺子和它左边的物品交换,如果勺子已经在最左边,就不需要移动。

Notes

为叙述方便,称这个物体为 A。

  • 首先执行 n1n - 1 次「将 A 与左边的物体交换」,现在 A 一定在最左边;
  • 再执行 k1k - 1 次「将 A 与右边的物体交换」,A 就在第 kk 个位置了。

想法很简单,但这样操作就没有魔术效果了(笑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <bits/stdc++.h>
using namespace std;

int main() {
int t;
cin >> t;

while (t--) {
int n, m, k;
cin >> n >> m >> k;

for (int i = 1; i < n; i++) {
cout << m << " 1\n";
}
for (int i = 1; i < k; i++) {
cout << m << " 2\n";
}
}

return 0;
}