题解:P10400 『STA - R5』消失的计算机

· · 题解

前置部分

我的编号方法

在代码里可能会出现一些特殊编号,解释如下。

爆标 199 行。

34
dec 12
dec 12
dec 13
dec 13
dec 13
dec 15
dec 15
dec 15
dec 15
dec 15
dec 2
assign 3 1000
dec 3
assign 4 1000
dec 4
assign 5 1000
dec 5
assign 6 1000
dec 6
assign 7 1000
dec 7
dec 10
ifneq 7 15 goto 21
ifneq 6 15 goto 19
ifneq 5 13 goto 17
ifneq 4 12 goto 15
ifneq 3 12 goto 13
ifneq 2 12 goto 11
dec 1
dec 11
ifneq 1 1000 goto 29
new 999
dec 11
ifneq 10 11 goto 32

Task 4

不用多说。

1
new 1

Task 5

分解 n^2 - 1,得 (n+1)(n-1)。由于也是输出,所以式子应减 n,变为 (n+1)(n-2) + 1。于是使用乘法,问题就十分简单了。

10
assign 3 1
dec 3
dec 3
new 1
dec 1
assign 2 3
new 4
dec 2
ifneq 2 1000 goto 7
ifneq 1 1000 goto 5

Task 6

最简单的办法是 new 2000 次,但是行数显然超标,所以难点在于构造 2000(实际是 -2000)。2000 = 2^4 \times 5^3,为使行数最少,我决定用 4^2 \times 5^3 来构造。

爆标 5 行。

24
dec 14
dec 14
dec 14
dec 14
dec 15
dec 15
dec 15
dec 15
dec 15
dec 2
assign 3 1000
dec 3
assign 4 1000
dec 4
assign 5 1000
dec 5
assign 6 1000
new 1
dec 6
ifneq 6 15 goto 18
ifneq 5 15 goto 16
ifneq 4 15 goto 14
ifneq 3 14 goto 12
ifneq 2 14 goto 10

Task 7

还原求 \log 的场景。用变量记录底数,n 增加指数个, 若计数器数量到达底数则底数翻倍,n \gets n + 1

爆标 1 行。

13
dec 1
dec 1
dec 2
dec 2
assign 12 2
assign 10 1000
dec 12
dec 10
dec 1
ifneq 10 2 goto 7
new 999
assign 2 12
iftry 1 goto 5

Task 8

套用前置部分的取模即可。

爆标 1 行。

6
dec 1
dec 1
iftry 1 goto 1
new 3
dec 2
ifeq 1 2 goto 4

Task 9

分类讨论。

所以,我们只要用 Task 8 的方法求出模数,再判断:用一个循环分离奇偶数,再用一个循环分离 24

18
dec 1
dec 1
dec 1
dec 1
assign 2 1
dec 2
iftry 2 goto 1
dec 12
dec 12
assign 14 12
dec 14
dec 14
new 999
new 999
dec 1
dec 1
ifeq 1 14 goto 14
ifeq 1 12 goto 13

Task 10

首先想到的是构造与 n \operatorname{ln} n 尽可能相近的数,为 n \log_3 n。可是这样还是有误差,那么再加常数,得 n \log_3 n + 16(因为 16 = 2^4)。可是行数超标。

我们将 n \operatorname{ln} n 打出表来,发现相邻两数的差变化不大,这提醒我们可以用形如 y = kx 的值来求解。经过尝试,发现在 45 范围内比较接近。最终我使用 y = \frac {13n} 3。凑 4 非常简单,凑 \frac n 3 则用除法求出近似值即可。

14
dec 13
dec 13
dec 13
dec 3
assign 2 1
dec 2
new 999
ifneq 2 1000 goto 6
ifneq 3 13 goto 4
dec 1
dec 1
dec 1
new 999
iftry 1 goto 10

于是便完美地 A 掉这道题啦!