#P15832. [2025年山东集训第三轮]Diana的梦境

[2025年山东集训第三轮]Diana的梦境

题目背景

结束了一天的直播,疲倦的 Diana 很快便进入了梦乡。

“咦,这被子怎么这么短,都盖不到我的脚……” 朦胧中,Diana 突然感觉到了来自脚底的一丝凉意。她知道一定是因为自己一米八太高了,把被子横着盖了。于是她很努力地把被子翻过来,可她的力气太小了,搬动被子对她来说非常困难。

于是 Diana 突发奇想,翻转被子的过程和数学上的转置是相似的!而因为自己是枝江天才少女,所以只需要将被子视为矩阵,然后执行转置就可以了。不过,翻完之后,被子怎么还是盖不到自己的脚呢?Diana 猛然发现,自己的被子竟然是正方形的!难道真的因为自己睡了一觉就长高了,被子已经不够长了吗……

“原来是梦啊……” 醒来的 Diana 回忆这一切,觉得又有趣又心酸,自己仍然是一米吧的自己,而被子即使是矩形的,她也没有短边那么高。唯一有趣的点或许在于转置被子这一趣味的想象,她决定只向她的朋友分享梦中的这一部分。

题目描述

给定一个 n×nn\times n 的 bool 矩阵 BB,你需要对其进行转置。

你可以使用 105+110^5+1 个长度为 nn 的辅助 bool 数组 A0A105A_0\sim A_{10^5},其中 A0An1A_0\sim A_{n-1} 初值为 B0Bn1B_0\sim B_{n-1},剩余数组的初值全为 00

你可以调用以下操作:

  • AND x y z:将 AxA_x 赋值为 Ay&AzA_y \& A_z,你需要保证 0x,y,z1050\le x,y,z\le 10^5
  • OR x y z:将 AxA_x 赋值为 AyAzA_y \mid A_z,你需要保证 0x,y,z1050\le x,y,z\le 10^5
  • XOR x y z:将 AxA_x 赋值为 AyAzA_y\oplus A_z,你需要保证 0x,y,z1050\le x,y,z\le 10^5
  • SH x y z:将 AxA_x 赋值为 AyA_y 循环左移 zz 位,即 Ax,iA_{x,i} 最后的值为 Ay,(iz)modnA_{y,(i-z)\bmod n},你需要保证 0x,y1050\le x,y\le 10^50z<n0\le z<n
  • SET x y z:将 Ax,yA_{x,y} 赋值为 zz,你需要保证 0x1050\le x\le 10^50y<n0\le y<nz{0,1}z\in\{0,1\}

你需要在尽可能少的操作次数内使得对于所有矩阵 BB,在经过你进行的操作后,对于 0i,j<n0\le i,j<n 都有

Ai,j=Bj,i.A_{i,j}=B_{j,i}.

输入格式

一行一个整数 nn,代表矩阵的大小。

输出格式

第一行输出一个整数 mm,代表操作数量。

接下来 mm 行,每行按照题目描述中的格式输出一条命令。

你需要保证 m2×105m\le 2\times 10^50x,y,z1050\le x,y,z\le 10^5

样例 1 输入

1

样例 1 输出

0

样例 1 解释

本来这里有一个 n=2n=2 的样例,但是为了让选手获得更多分数,这个样例最终成为了一个测试点。

数据范围

本题共 4 个测试点。

对于前三个测试点,所有符合要求的输出都可以获得满分。

对于第四个测试点,如果你的输出合法,你的分数会按照以下公式计算并向下取整到最近的整数:

$$\mathrm{Score}=30\cdot \log_{10}\left(\frac{5\times 10^5}{\max(m,52000)-47000}\right).$$
测试点 分数 n=n=
1 10 2
2 15 32
3 512
4 60 2048