Codeforces Beta Round 76 (Div. 1 Only) |
---|
Закончено |
После провала программы Search Ultimate, искавшей строки в тексте за квадрат, Игорь К. задумался: "Отчего же, отчего моя программа работает так медленно?" Перепроверив еще раз свой код, он сказал: "В моем коде ошибок нет, однако я знаю, как мы будем улучшать Search Ultimate!" и достал с полки толстую книжку, на которой было написано "Аземблер. Принципиально новый подход".
Внимательно полистав эту книгу, Игорь К. понял, что, оказывается, умножение чисел можно проводить в десятки раз быстрее. "Search Ultimate будет быстра, как никогда!" — радостно прокричал он и приступил к работе.
Поясним теперь, в чем заключалась идея Игоря К. Дело в том, что код, генерируемый компилятором, далеко не оптимален — стандартное умножение чисел действительно работает медленнее, чем тот трюк, о котором рассказывалось в книжке.
В языке Azembler есть 26 регистров (eax, ebx, ..., ezx) и две команды:
На первый взгляд вторая операция кажется бессмысленной, но, оказывается, допустимо записывать эту операцию как
lea ecx, [eax + ebx],
lea ecx, [k*eax]
или даже
lea ecx, [ebx + k*eax],
где k = 1, 2, 4 или 8.
В результате в регистр ecx будут записаны соответственно числа eax + ebx, k*eax и ebx + k*eax. Но такая операция выполняется намного, в десятки раз, быстрее, чем обычное умножение чисел. А с помощью нескольких таких операций можно очень быстро умножить какое-либо число на другое. Конечно, вместо eax, ebx и ecx разрешено использовать любые регистры.
Например, пусть в регистре eax записано некоторое число, и требуется умножить его на 41. Это можно сделать в 2 cтрочки:
lea ebx, [eax + 4*eax] // теперь ebx = 5*eax
lea eax, [eax + 8*ebx] // теперь eax = eax + 8*ebx = 41*eax
Игорь К. заинтересовался, а каким минимальным числом операций lea можно умножить число на некоторое заданное число n и как это сделать. Ваша задача — помочь ему.
Считайте, что в начальный момент регистр eax содержит число, которое Игорь К. собрался умножать на n, а регистры от ebx до ezx содержат число 0. В конечный момент времени ответ может находиться в любом регистре.
В входных данных записано единственное целое число n (1 ≤ n ≤ 255), умножение на которое предстоит реализовать Игорю К.
В первой строке выведите число p — минимальное число операций lea, необходимое для этого. Затем выведите программу из p команд, выполняющую эти операции. Гарантируется, что такая программа существует для любого n от 1 до 255.
Используйте в точности следующий формат команд (здесь k равно 1, 2, 4 или 8, а x, y и z — это любые, возможно совпадающие, регистры):
lea x, [y]
lea x, [y + z]
lea x, [k*y]
lea x, [y + k*z]
Обратите внимание на то, что в конце каждой команды недопустимы лишние пробелы.
41
2
lea ebx, [eax + 4*eax]
lea ecx, [eax + 8*ebx]
2
1
lea ebx, [eax + eax]
4
1
lea ebx, [4*eax]
Название |
---|