CF1747B.BAN BAN

传统题 时间 2000 ms 内存 256 MiB 4 尝试 1 已通过 1 标签

BAN BAN

题目描述

给定一个整数 nn

我们定义 s(n)s(n) 为字符串 "BAN" 连续拼接 nn 次。例如,s(1)=s(1) = "BAN",s(3)=s(3) = "BANBANBAN"。注意,字符串 s(n)s(n) 的长度等于 3n3n

考虑 s(n)s(n)。你可以对 s(n)s(n) 执行如下操作任意次(也可以不执行):

  • 选择任意两个不同的下标 iijj1i,j3n,ij1 \leq i, j \leq 3n, i \ne j)。
  • 然后交换 s(n)is(n)_is(n)js(n)_j 的字符。

你希望经过若干次操作后,字符串 s(n)s(n) 不再包含 "BAN" 作为子序列。请问最少需要多少次操作才能实现?同时,输出一种满足条件的最短操作序列。

如果字符串 aa 可以通过删除字符串 bb 的若干(可以为零或全部)字符得到,则称 aabb 的一个子序列。

输入格式

输入包含多组测试数据。第一行包含一个整数 tt1t1001 \leq t \leq 100),表示测试用例的数量。

接下来每个测试用例占一行,每行包含一个整数 nn1n1001 \leq n \leq 100)。

输出格式

对于每个测试用例,第一行输出一个整数 mm0m1050 \le m \le 10^5),表示所需的最小操作次数。保证在题目给定的约束下,目标总是可以在 10510^5 次操作内实现。

接下来输出 mm 行,每行两个整数 iki_kjkj_k1ik,jk3n,ikjk1\leq i_k, j_k \leq 3n, i_k \ne j_k),表示第 kk 次操作交换下标 iki_kjkj_k 处的字符。

所有操作完成后,s(n)s(n) 中不应再包含 "BAN" 作为子序列。

如果有多种方案,输出任意一种均可。

说明/提示

在第一个测试用例中,s(1)=s(1) = "BAN",我们可以交换 s(1)1s(1)_1s(1)2s(1)_2,将 s(1)s(1) 变为 "ABN",此时不再包含 "BAN" 作为子序列。

在第二个测试用例中,s(2)=s(2) = "BANBAN",我们可以交换 s(2)2s(2)_2s(2)6s(2)_6,将 s(2)s(2) 变为 "BNNBAA",此时不再包含 "BAN" 作为子序列。

由 ChatGPT 4.1 翻译

样例

2
1
2
1
1 2
1
2 6

在线编程 IDE

建议全屏模式获得最佳体验