QOJ.ac

QOJ

Limite de temps : 10.0 s Limite de mémoire : 256 MB Points totaux : 100

#15989. 栈机执行器

Statistiques

许多密码可以通过使用各种机器和自动机更快地计算。在本题中,我们将关注一种特殊类型的机器,称为栈机(stack machine)。它的名字来源于该机器使用著名的数据结构——栈进行操作。后存入的值在栈顶,较旧的值在栈底。机器指令通常仅操作栈顶。

我们的栈机相对简单:它仅处理整数,除了栈之外没有其他存储空间(没有寄存器等),也没有特殊的输入或输出设备。指令集如下:

  • NUM X:其中 $X$ 是一个非负整数,$0 \le X \le 10^9$。NUM 指令将数字 $X$ 压入栈顶。这是唯一带参数的指令。
  • POP:移除栈顶的数字。
  • INV:改变栈顶数字的符号($42 \to -42$)。
  • DUP:复制栈顶的数字并压入栈。
  • SWP:交换栈顶两个数字的位置。
  • ADD:将栈顶的两个数字相加。
  • SUB:用“第二个数字”(即栈顶之下的那个数字)减去栈顶数字。
  • MUL:将栈顶的两个数字相乘。
  • DIV:将栈顶的两个数字进行整除。栈顶数字作为除数,其下方的数字作为被除数。商将作为结果存入。
  • MOD:取模操作。操作数与整除相同,但余数作为结果存入。

所有双目运算符都将栈顶数字视为“右”操作数,将第二个数字(下方的数字)视为“左”操作数。所有这些操作都会从栈中移除这两个操作数,并将结果放回栈顶以代替原来的两个数。

如果栈中的数字不足以执行某条指令(需要一个或两个),该指令的执行将导致程序失败。如果除数变为零(对于 DIVMOD),或者任何操作的结果绝对值超过 $10^9$,也会发生失败。这意味着机器仅在 $[-1\,000\,000\,000, 1\,000\,000\,000]$(含两端)范围内的数字上进行操作。

为了避免在处理负除数和余数时产生歧义:如果除法操作的某个操作数为负数,结果的绝对值应始终使用操作数的绝对值来计算,其符号确定如下:当且仅当恰好有一个操作数为负数时,商为负数。余数的符号与被除数相同。因此,$13 \text{ div } -4 = -3$,$-13 \text{ mod } 4 = -1$,$-13 \text{ mod } -4 = -1$ 等。

如果由于任何原因发生失败,机器将停止当前程序的执行,并且在该程序运行中不再评估其他指令。

输入格式

输入包含多个机器的描述。每个机器由两部分描述:程序和输入部分。

程序由一系列指令给出,每行一条。每条指令由三个大写字母组成,且不得有任何其他字符。唯一的例外是 NUM 指令,它在三个字母后恰好有一个空格,后跟一个介于 $0$ 和 $10^9$ 之间的非负整数。唯一允许的指令是上面定义的那些。每个程序都以包含单词 END(且没有其他内容)的一行结束。

输入部分以一个整数 $N$($0 \le N \le 10\,000$)开始,表示程序执行的次数。接下来的 $N$ 行每行包含一个数字,指定输入值 $V_i$($0 \le V_i \le 10^9$)。程序应针对这些值中的每一个独立执行一次,每次执行开始时,栈中包含一个数字——输入值 $V_i$。

每个机器描述的末尾都有一个空行。最后一个机器后面跟着一行,包含单词 QUIT。任何程序包含的指令都不会超过 $100\,000$ 条,且在执行过程中的任何时刻,任何程序都不需要栈中超过 $1\,000$ 个数字。

输出格式

对于每个输入值,打印一行,其中包含对应执行的输出值,即程序在初始栈仅包含输入数字的情况下执行后,栈中留下的那一个数字。

如果在执行过程中发生程序失败,或者在运行结束时栈的大小不正确(为空或多于一个数字),则打印单词 ERROR

在每个机器(包括最后一个)之后打印一个空行。

样例

输入样例 1

DUP
MUL
NUM 2
ADD
END
3
1
10
50

NUM 1
NUM 1
ADD
END
2
42
43

NUM 600000000
ADD
END
3
0
600000000
1

QUIT

输出样例 1

3
102
2502

ERROR
ERROR

600000000
ERROR
600000001

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.