eolymp
bolt
Попробуйте наш новый интерфейс для отправки задач
Задачи

Оптимальная программа

Оптимальная программа

Как вы знаете, написание программы, дело зачастую далеко не такое простое, как может показаться. И этот процесс становится еще труднее, если ваши программы должны работать как можно быстрее. А иногда есть веские основания, чтобы они были быстрыми. У многих крупных программных кодах, такие как операционные системы и базы данных, есть "узкие места" - сегменты кода, которые будут выполняться снова и снова, и "пожирать" значительную часть от общего времени работы. Как правило, эту часть кода приходится переписывать на ассемблере, потому что даже небольшая экономия времени работы будет очень важна, особенно если код выполняется миллиарды раз. В этой задаче мы будем рассматривать задачу автоматизации генерации оптимального ассемблерного кода. Для заданных функций (в виде ряда входных/выходных пар), вы должны придумать кратчайшую программу, которая вычисляет эти функции. Ваша программа будет работать на основе стековой машины, которая поддерживает только пять команд: \textbf{ADD}, \textbf{SUB}, \textbf{MUL}, \textbf{DIV} и \textbf{DUP}. Первые четыре команды берут два верхних элемента из стека и заменяют их в стеке суммой, разностью, произведением или делением нацело соответственно. Команда \textbf{DUP} добавляет в вершину стека дополнительную копию самого верхнего элемента в стеке. Таким образом, если команды применяются к стеку с двумя верхними элементами \textbf{a} и \textbf{b}, то в результате стек выглядит следующим образом: \includegraphics{https://static.e-olymp.com/content/8b/8b313c38caccc4e4e4b83cb783fed5a8f5944453.jpg} В начале выполнения программы стек будет содержать только одно входное целое число. В конце вычислений стек должен содержать только одно целое число, это число является результатом вычислений. Есть три случая, когда стековая машина входит в состояние ошибки: \begin{itemize} \item Команда \textbf{DIV} не выполняется, если самый верхний элемент стека равен \textbf{0}. \item Команды \textbf{ADD}, \textbf{SUB}, \textbf{MUL} и \textbf{DIV} не будут выполнены, если стек содержит только один элемент. \item В результате выполнения операция получаем значение большее, чем \textbf{30000} по абсолютной величине. \end{itemize} \InputFile Ввод состоит из серии описания функций. Каждое описание начинается со строки, содержащей целое число \textbf{n} (\textbf{n} ≤ \textbf{10}), количество пар входов/выходов. Следующие две строки содержит \textbf{n} целых чисел - каждое из них соответственно входные и выходные значения пар чисел. Входные числа будут не больше \textbf{30000} по абсолютной величине. Входные данные завершаются строкой со значением \textbf{n = 0}. Этот тест не обрабатывается. \OutputFile \includegraphics{https://static.e-olymp.com/content/a0/a01d6fe5baf86fd274dfc5600a30f76cc672dd3c.jpg} Вы должны написать кратчайший программу, которая вычисляет функцию \textbf{f}, такую, что \textbf{f(x_i) = y_i} для всех \textbf{i} \{\textbf{1}, ..., \textbf{n}\}. Это означает, что программа не может вступать в состоянии ошибки для заданных на входе \textbf{x}, хотя она может войти в состояние ошибки для других значений. Рассматривать будем только те программы, которые имеют не более \textbf{10} заданных пар значений. Для каждой функции описания сначала выведите номер описание. Затем выведите последовательность команд, которые составляют кратчайшую программу для вычисления данной функции. Если есть больше чем одна такая программа, вывести лексикографически наименьшую. Если нет программы из не более \textbf{10} команд, которые вычисляют функцию, вывести строку "\textbf{Impossible}". Если кратчайшая программа состоит из нуля команд, вывести "\textbf{Empty sequence}". Выводите пустую строку между разными тестовыми случаями.
Лимит времени 1 секунда
Лимит использования памяти 64 MiB
Входные данные #1
4
1 2 3 4
0 -2 -6 -12
3
1 2 3
1 11 1998
1
1998
1998
0
Выходные данные #1
Program 1
DUP DUP MUL SUB

Program 2
Impossible

Program 3
Empty sequence