UVA656 Optimal Programs
题目描述
众所周知,编程一般不是一件容易的事。如果要求你的程序尽可能的快,事情就更复杂了。然而,有时这种要求是有道理的。一些大型的程序或项目,例如操作系统和数据库,有“瓶颈”:不断被执行的一小段程序,总体的运行时间中占据相当的比例。因此,用汇编语言重写这(些)部分是值得的,因为,即使优化的不多,如果代码被执行成千上万次,最后也可以节省很长时间。
在这道题里面,我们尝试将生成最优的汇编代码的过程自动化。即,给定一个函数(通过一系列对应的输入/输出,具体格式见下文),你需要给出最短的“汇编”代码。
本题里的“汇编”代码基于栈结构,有且仅有以下 5 个指令:ADD(加),SUB(减),MUL(乘),DIV(整除,类似于C++的`/`或Python的`//`),DUP(复制)。前四种指令对应四则运算,从栈中弹出栈顶的2个数,并将运算结果压栈;最后一种将栈顶的元素复制。
如果将该命令作用于一个如左图所示的栈,将 $a,b$ 压入栈,进行不同操作的结果如下:
```plain
初始栈 ADD SUB MUL DIV DUP
| | | | | | | | | | | a |
| a | | | | | | | | | | a |
| b | |b+a| |b-a| |b*a| |b/a| | b |
| c | | c | | c | | c | | c | | c |
+---+ +---+ +---+ +---+ +---+ +---+
```
在程序的开始,栈中只有一个元素,即程序的输入。程序结束时,栈中应该只有一个元素,即程序的输出,也是计算的结果。
以下 3 种情况程序会报错:
- 在 DIV(整除)命令中除数为0
- 在栈中仅有 1 个元素时进行 ADD(加)、SUB(减)、MUL(乘)、DIV(整除)命令
- 运算的某一时刻栈中有元素的绝对值超过 30000
输入格式
输入有多组数据。
对于每组子数据:
第一行,一个整数 $n(n\le 10)$。
第二行是 $n$ 个互不相同的整数 $x_1,x_2,\dots ,x_n$,表示程序的输入。
第三行同样是 $n$ 个整数 $y_1,y_2,\dots ,y_n$,$y_i$ 为程序在输入 $x_i$ 时的输出。
**数据保证 $x_i,y_i$ 的绝对值均小于30000**
输入以 $n=0$ 结束。
输出格式
你需要找到最短的函数 $f$ ,使得对于所有的 $1 \le i \le n$,均有 $f(x_i)=y_i$。注意,你的程序对于所有指定的输入不能报错(但在输入清单外的有可能报错)。注意,程序的长度最大是 10。
对于每组子数据,首先输出 `Program k`(意为“第 $k$ 个程序”),其中 $k$ 是子数据的ID(从1开始)。随后输出满足条件的最短程序。如有多组同样短的,输出字典序最小。如果不能用10条语句及以下的程序实现,输出 `Impossible` (意为“不可能”)。如果存在可以不用处理直接输出的情况(即可以用 0 条语句实现),输出 `Empty Sequence` (意为“序列为空”)。
#### 样例解释
第一组子数据相当于 $f(x)=x-x^2$ ,可用 `DUP DUP MUL SUB` 解决。
不存在能在 10 条语句以内解决第二组子数据的。
第三组子数据可以用一个空程序解决。