#P14936. [uoi2019]Atlas机器人
[uoi2019]Atlas机器人
题目描述
众所周知,哥萨克·乌斯有一个他童年时非常喜欢的机器人 Atlas。今天乌斯发现,自己从来没有试着把这个机器人编程去完成别的事情,于是他开始阅读说明书。
说明书中写道:Atlas 的内存中保存着 个从 开始编号的寄存器,每个寄存器包含 个二进制位。因此,每个寄存器都由 个 或 组成。

乌斯还发现,可以使用下面 种命令对寄存器进行操作。为了方便,称编号为 的寄存器为寄存器 ,并记 为寄存器 中存储的无符号整数。
setValue(i, j):将寄存器 替换为寄存器 ,即 。setXor(i, j, k):将寄存器 替换为寄存器 与寄存器 的按位xor,即 。setAnd(i, j, k):将寄存器 替换为寄存器 与寄存器 的按位and,即 。setOr(i, j, k):将寄存器 替换为寄存器 与寄存器 的按位or,即 。shiftLeft(i, x):将寄存器 的所有二进制位向左移动 位。shiftRight(i, x):将寄存器 的所有二进制位向右移动 位。setNot(i, j):将寄存器 替换为寄存器 的按位取反。也就是说,如果寄存器 某一位为 ,则寄存器 的对应位为 ;反之为 。
两个二进制位执行 xor 的结果是:若两位相同,结果为 ;若两位不同,结果为 。

两个二进制位执行 and 的结果是:仅当两位都为 时,结果为 ;否则为 。

两个二进制位执行 or 的结果是:仅当两位都为 时,结果为 ;否则为 。

寄存器向左移动 位后,新寄存器的每一位等于原寄存器中向右数 位处的那一位;如果原寄存器中不存在这样的位置,则这一位为 。

寄存器向右移动 位后,新寄存器的每一位等于原寄存器中向左数 位处的那一位;如果原寄存器中不存在这样的位置,则这一位为 。

读完说明书后,哥萨克·乌斯立刻想出了 个有趣的任务。对于每个任务,你需要给机器人输入一串命令,使得机器人完成对应任务。
设你在某个任务中执行的命令数为 。
任务列表与评分
子任务 1:判断偶数,最高 分
寄存器 中写有数 。所有其他寄存器初始时均为 。
令 表示 为偶数,令 表示 为奇数。你的目标是:执行命令后,使寄存器 中写有 。
得分为:
子任务 2:加法,最高 分
寄存器 中写有 ,寄存器 中写有 。所有其他寄存器初始时均为 。
令 。你的目标是:执行命令后,使寄存器 中写有 。
如果 的二进制表示需要超过 位,则寄存器 中只保留低 位,也就是结果按 取模。
得分为:
$$\left\lfloor 10-\sqrt[3]{t-\min(260,t)}\right\rfloor$$子任务 3:统计二进制中 的个数,最高 分
寄存器 中写有数 。
令 为 的二进制表示中 的个数。你的目标是:执行命令后,使寄存器 中写有 。
本 Hydro 配置中的评测器按如下公式给分:
$$\left\lfloor 13-\frac{\ln(t-\min(1505,t)+1)}{1.2}\right\rfloor$$子任务 4:比较大小,最高 分
寄存器 与寄存器 中分别写有两个不同的数 与 。
你的目标是:执行命令后,使:
- 寄存器 中写有 ;
- 寄存器 中写有 。
其中 表示:若命题 为真,则值为 ;否则值为 。
得分为:
$$\left\lfloor 23-\sqrt[2.5]{t-\min(92,t)}\right\rfloor$$子任务 5:构造 ,最高 分
寄存器 中写有数 。
令 为 的二进制表示中 的个数。你的目标是:执行命令后,使寄存器 中写有 。
得分为:
$$\left\lfloor 18-\sqrt[4]{t-\min(6560,t)}\right\rfloor$$子任务 6:排序 个数,最高 分
设 是一个包含 个非负整数的数组,且这 个整数两两不同。初始时,对于 ,寄存器 中写有 。
令 为将数组 按升序排序后的数组。你的目标是:执行命令后,对于每个 ,寄存器 中写有 。
数组 与 均从 开始编号。
得分为:
$$\left\lfloor 30-\sqrt[3]{t-\min(4644,t)}\right\rfloor$$额外说明
如果没有特别说明某个寄存器的初始值,则它初始时全部由 组成。
所有数都在 到 之间。寄存器中的运算均按 位无符号整数进行。
你需要找到一串命令,使其对于该子任务的任意合法初始数据都正确。
你最多可以输出 条命令。若命令数超过 ,将被判为错误。若输出了非法命令或非法参数,也会被判为错误。
本题只检查任务要求的结果寄存器,其他寄存器中可以是任意数。
Hydro 版输入格式
本题在 Hydro 中配置为普通输入输出题,但使用 Special Judge 模拟机器人命令。
输入文件第一行包含两个整数:
G T
其中 表示当前测试点对应的子任务编号,; 是评测器使用的测试组数。
随后若干行是评测器用于验证命令正确性的隐藏数据。你的程序可以只读取 ,忽略其余输入。
Hydro 版输出格式
第一行输出一个整数 ,表示命令条数。
接下来输出 行,每行表示一条命令。为了适配普通输出格式,七种命令用数字编码:
| 编号 | 输出格式 | 对应命令 |
|---|---|---|
1 |
1 i j |
setValue(i, j) |
2 |
2 i j k |
setXor(i, j, k) |
3 |
3 i j k |
setAnd(i, j, k) |
4 |
4 i j k |
setOr(i, j, k) |
5 |
5 i x |
shiftLeft(i, x) |
6 |
6 i x |
shiftRight(i, x) |
7 |
7 i j |
setNot(i, j) |
参数限制如下:
- 寄存器编号必须满足 ;
- 位移量必须满足 。
输出中不需要加入原包中的密码行。本 Hydro 配置已经将原始 checker 的密码要求去掉。
说明样例
假设寄存器 中写有 ,寄存器 中写有 。如果执行如下命令:
setValue(3, 1)
setXor(4, 1, 2)
setAnd(5, 1, 2)
setOr(6, 2, 1)
shiftLeft(2, 3)
shiftRight(1, 2)
setNot(7, 2)
则前七个寄存器中的数会变成:
若按 Hydro 输出格式写,上述命令序列应写作:
7
1 3 1
2 4 1 2
3 5 1 2
4 6 2 1
5 2 3
6 1 2
7 7 2
兼容说明:原官方评测格式在输出最后需要一行固定密码
958299301。本 Hydro 版本不要求输出该密码;若使用旧模板额外输出该行,特判也会兼容接受。