CF1747B BAN BAN

题目描述

给定一个整数 $n$。 我们定义 $s(n)$ 为字符串 "BAN" 连续拼接 $n$ 次。例如,$s(1) = $ "BAN",$s(3) = $ "BANBANBAN"。注意,字符串 $s(n)$ 的长度等于 $3n$。 考虑 $s(n)$。你可以对 $s(n)$ 执行如下操作任意次(也可以不执行): - 选择任意两个不同的下标 $i$ 和 $j$($1 \leq i, j \leq 3n, i \ne j$)。 - 然后交换 $s(n)_i$ 和 $s(n)_j$ 的字符。 你希望经过若干次操作后,字符串 $s(n)$ 不再包含 "BAN" 作为子序列。请问最少需要多少次操作才能实现?同时,输出一种满足条件的最短操作序列。 如果字符串 $a$ 可以通过删除字符串 $b$ 的若干(可以为零或全部)字符得到,则称 $a$ 是 $b$ 的一个子序列。

输入格式

输入包含多组测试数据。第一行包含一个整数 $t$($1 \leq t \leq 100$),表示测试用例的数量。 接下来每个测试用例占一行,每行包含一个整数 $n$($1 \leq n \leq 100$)。

输出格式

对于每个测试用例,第一行输出一个整数 $m$($0 \le m \le 10^5$),表示所需的最小操作次数。保证在题目给定的约束下,目标总是可以在 $10^5$ 次操作内实现。 接下来输出 $m$ 行,每行两个整数 $i_k$ 和 $j_k$($1\leq i_k, j_k \leq 3n, i_k \ne j_k$),表示第 $k$ 次操作交换下标 $i_k$ 和 $j_k$ 处的字符。 所有操作完成后,$s(n)$ 中不应再包含 "BAN" 作为子序列。 如果有多种方案,输出任意一种均可。

说明/提示

在第一个测试用例中,$s(1) = $ "BAN",我们可以交换 $s(1)_1$ 和 $s(1)_2$,将 $s(1)$ 变为 "ABN",此时不再包含 "BAN" 作为子序列。 在第二个测试用例中,$s(2) = $ "BANBAN",我们可以交换 $s(2)_2$ 和 $s(2)_6$,将 $s(2)$ 变为 "BNNBAA",此时不再包含 "BAN" 作为子序列。 由 ChatGPT 4.1 翻译