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