#P13088. 『STA - H1』Code Golf (68bit)

    ID: 12725 Type: RemoteJudge 1000ms 512MiB Tried: 0 Accepted: 0 Difficulty: (None) Uploaded By: Tags>提交答案Special JudgeO2优化

『STA - H1』Code Golf (68bit)

题目背景

这是问题的 68bit 版本。本题与 24bit 版本16bit[v] 版本的区别在于此版本中电路的位长 w=68w=68。此外,16bit[v] 版本和本题的另一个区别是本题的电路中 LSHRSH 的右操作数必须是字面量。

题目描述

本题为提交答案题。

以下是简要题面,关于其中名词的详细定义见后文(有些名词可能和你所见过的定义并不完全相符)。

定义所有长度为 4\bm4 的排列组成的集合为 P\mathcal Pw=68w=\color{blue}68 是位长,BB[0,2w)[0,2^w) 内的整数组成的集合。

你需要设计一个函数 f:PBf:\mathcal P\to B 和一个电路 C:(B,B)BC:(B, B)\to B,使得对于任意 p,qPp,q\in\mathcal P 都有:

cyc(pq)=C(f(p),f(q))\operatorname{cyc}(p\circ q)=C(f(p),f(q))

其中 \circ 是排列的复合,cyc()\operatorname{cyc}(\cdot) 表示排列的置换环个数。

电路 CC 中涉及到的运算门个数不能超过 10410^4,得分将根据电路 CC 中的运算门个数评定,得分计算方式见说明 / 提示部分。


以下是可能涉及到的定义:

关于排列

一个长度为 nn 的排列是元素为 11nn 中互不重复的整数的长度为 nn 的序列。两个排列 p,qp,q 的复合 (pq)i=pqi(p\circ q)_i=p_{q_i}。对于一个排列 pp,集合 SS 是其置换环当且仅当 SS 是极小的满足 S={pxxS}S=\{p_x\mid x\in S\} 的集合。cyc(p)\operatorname{cyc}(p) 是排列 pp 的置换环个数。

一个排列 pp 的排名是字典序不大于它的排列个数,关于字典序的定义选手可以自行搜索。

关于电路

在一个电路 CC 中,你有 100100 个变量 x1100x_{1\dots 100} 可供使用,其中 x1,x2x_1,x_2 是输入信号接收 CC 的两个参数,x3x_3 是输出信号在电路运行完毕后作为 CC 的返回值传出。初始除了 x1,x2x_1,x_2 每个变量的值都是 00。每个变量都是 BB 内的整数,并且运算时随时保持对 2w2^w 取模。你可以认为电路中的变量都是 ww 位的自然溢出的无符号整数。

一个数值有以下两种表达(后将值为 pp 的数值记作 #p,不带 # 的字母表示普通变量):

  • i,表示变量 xix_i
  • N n,表示十进制字面量 nn,其中 0n<2w0\le n<2^w

电路由若干计算门组成,所有计算门按顺序依次进行。计算门分以下七种:

  • i AND #p #q,令 xipqx_i\gets p\land q,其中 \land 是按位与运算。
  • i OR #p #q,令 xipqx_i\gets p\lor q,其中 \lor 是按位或运算。
  • i XOR #p #q,令 xipqx_i\gets p\oplus q,其中 \oplus 是按位异或运算。
  • i NOT #p,令 xi¬px_i\gets \lnot p,其中 ¬\lnot 是按位取反运算。
  • i LSH #p #q,令 xip2qx_i\gets p\cdot 2^q其中要求 q<w\bm{q<w}q\bm q 必须是字面量
  • i RSH #p #q,令 xip2qx_i\gets \lfloor\frac p{2^q}\rfloor其中要求 q<w\bm{q<w}q\bm q 必须是字面量
  • i POPCNT #p,令 xipopcount(p)x_i\gets\operatorname{popcount}(p),其中 popcount()\operatorname{popcount}(\cdot) 表示二进制中一的个数。

关于各类位运算的详细定义,选手可以自行搜索。

输入格式

没有任何输入。

输出格式

你可以选择提交答案的生成器代码,或者直接提交答案。如果想要直接提交答案的话需要把答案文件压缩到一个 zip 文件内并使用提交文件方式提交。

首先 2424 行,第 ii 行一个 [0,2w)[0,2^w) 内的整数 xx 表示排名为 ii 的排列 ppfff(p)=xf(p)=x

接下来一行一个非负整数 LL,表示电路涉及到的计算门个数。

接下来 LL 行,每行描述一个计算门。


1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576
2097152
4194304
8388608
3
3 XOR 1 2
3 OR 3 N 7
3 POPCNT 3

提示

样例解释

样例仅供演示输出格式,并没有实际意义,也不能在本题得到任何分数。

样例输出中的电路 CC 描述了 C(x,y)=popcount((xy)7)C(x,y)=\operatorname{popcount}((x\oplus y)\lor7)

电路模拟

我们在下发文件中提供了一个可以计算电路的运行结果的 C++ 代码 compiler.cpp(需要以 GCC、至少 C++ 11 标准运行),选手可以使用 compiler.cpp 辅助理解电路的运行模式。

注意:compiler.cpp 仅对合法的输入有效,对不合法的输入的运行结果不做任何保证。

评分标准

若你的输出出现下列情况,那么该测试点不得分:

  • cyc(pq)C(f(p),f(q))\operatorname{cyc}(p\circ q)\neq C(f(p),f(q))
  • 电路 CC 不合法(使用标号不在 [1,100][1,100] 内的变量 / 字面量的值 2w\ge2^w / 出现无法识别或不合法的语句 / 使用超过 10410^4 个运算门 / 运算门参数不合法)。

否则若你使用了 cc 个运算门,那么你的得分为:

$$\mathrm{score}=\left\lfloor\frac{500}{\max\{5,\min\{500,x\}\}}\right\rfloor $$

提示:如果 c5c\le5,你的得分 score=100\mathrm{score}=100