QOJ.ac

QOJ

実行時間制限: 1.0 s メモリ制限: 256 MB 満点: 100 難易度: [表示] ハック可能 ✓

#7104. 停机问题

統計

在计算理论中,停机问题是指根据任意计算机程序的描述,判断该程序是会运行结束(即停机)还是会永远运行下去的问题。

Alan Turing 在 1936 年证明了解决停机问题的通用算法是不存在的,但我们敬爱的算法科学家 DreamGrid 声称他刚刚在一种特定的编程语言——“梦语言”(Dream Language)中找到了停机问题的解法!

梦语言是一种仅包含 5 种指令的编程语言。所有这些指令都会读取或写入一个 8 位寄存器 $r$,其初始值设为 0。我们现在在下表中列出这 5 种指令。注意,我们将当前指令记为第 $i$ 条指令。

指令 描述
add v 将 $v$ 加到寄存器 $r$ 中。由于 $r$ 是一个 8 位寄存器,该指令实际上计算 $(r + v) \pmod{256}$ 并将结果存入 $r$,即 $r \leftarrow (r + v) \pmod{256}$。之后,继续执行第 $(i + 1)$ 条指令。
beq v k 如果 $r$ 的值等于 $v$,则跳转到第 $k$ 条指令,否则继续执行第 $(i + 1)$ 条指令。
bne v k 如果 $r$ 的值不等于 $v$,则跳转到第 $k$ 条指令,否则继续执行第 $(i + 1)$ 条指令。
blt v k 如果 $r$ 的值严格小于 $v$,则跳转到第 $k$ 条指令,否则继续执行第 $(i + 1)$ 条指令。
bgt v k 如果 $r$ 的值严格大于 $v$,则跳转到第 $k$ 条指令,否则继续执行第 $(i + 1)$ 条指令。

一个包含 $n$ 条指令的梦语言程序总是从第 1 条指令开始执行,并且仅当程序试图执行第 $(n + 1)$ 条指令时才会停机(即停止执行)。

作为 DreamGrid 的助手,为了帮助他赢得图灵奖,请你编写一个程序来判断给定的梦语言程序是否最终会停机。

输入格式

输入包含多组测试数据。输入的第一行是一个整数 $T$,表示测试数据的组数。对于每组测试数据:

第一行包含一个整数 $n$ ($1 \le n \le 10^4$),表示接下来的梦语言程序中的指令条数。

接下来的 $n$ 行中,第 $i$ 行首先包含一个字符串 $s$ ($s \in \{\text{"add", "beq", "bne", "blt", "bgt"}\}$),表示程序中第 $i$ 条指令的类型。

  • 如果 $s$ 为 "add",则后面跟一个整数 $v$ ($0 \le v \le 255$),表示加到寄存器中的值;
  • 否则,后面跟两个整数 $v$ 和 $k$ ($0 \le v \le 255, 1 \le k \le n$),表示条件值和跳转的目标。

保证所有测试数据的 $n$ 之和不超过 $10^5$。

输出格式

对于每组测试数据,输出一行。如果程序最终会停机,输出 "Yes"(不含引号);如果程序会永远运行下去,输出 "No"(不含引号)。

样例

样例输入 1

4
2
add 1
blt 5 1
3
add 252
add 1
bgt 252 2
2
add 2
bne 7 1
3
add 1
bne 252 1
beq 252 1

样例输出 1

Yes
Yes
No
No

说明

对于第二个样例测试数据,请注意 $r$ 是一个 8 位寄存器,因此在执行四次 "add 1" 指令后,$r$ 的值将从 252 变为 0,程序将会停机。

对于第三个样例测试数据,很容易发现 $r$ 的值将始终为偶数,因此 $r$ 的值不可能等于 7,程序将永远运行下去。

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
#291EditorialOpen题解jiangly2025-12-14 06:54:00View

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.