300487: CF93C. Azembler

Memory Limit:256 MB Time Limit:5 S
Judge Style:Text Compare Creator:
Submit:0 Solved:0

Description

Azembler

题意翻译

你有 `eax,ebx,ecx,...,ezx` 这26个寄存器,初始 `eax` 中会有一个数,其余为 $0$。 定义一个指令序列包含以下四类指令: - `lea x, [y]` 将寄存器 $y$ 中的值赋给寄存器 $x$。 - `lea x, [y + z]` 将寄存器 $y$ 与 $z$ 中的值之和赋给寄存器 $x$。 - `lea x, [k*y]` 将寄存器 $y$ 中的值的 $k$ 倍赋给寄存器 $x$。 - `lea x, [y + k*z]` 将寄存器 $y$ 中的值的 $k$ 倍与寄存器 $z$ 中的值之和赋给寄存器 $x$。 注意,这里的 `k=1,2,4,8`,`x,y,z` 可以为任意寄存器。 输入一个数 $n$ 满足 $1 ≤ n ≤ 255$ 。表示需要将寄存器 `eax` 中的数变成原来的 $n$ 倍(只要末状态存在一个寄存器,其中的值为此值即可) 输出行数最少的任意的指令序列,不能有行末空格。

题目描述

After the Search Ultimate program that searched for strings in a text failed, Igor K. got to think: "Why on Earth does my program work so slowly?" As he double-checked his code, he said: "My code contains no errors, yet I know how we will improve Search Ultimate!" and took a large book from the shelves. The book read "Azembler. Principally New Approach". Having carefully thumbed through the book, Igor K. realised that, as it turns out, you can multiply the numbers dozens of times faster. "Search Ultimate will be faster than it has ever been!" — the fellow shouted happily and set to work. Let us now clarify what Igor's idea was. The thing is that the code that was generated by a compiler was far from perfect. Standard multiplying does work slower than with the trick the book mentioned. The Azembler language operates with 26 registers (eax, ebx, ..., ezx) and two commands: - \[ $ x $ \] — returns the value located in the address $ x $ . For example, \[eax\] returns the value that was located in the address, equal to the value in the register eax. - lea $ x $ , $ y $ — assigns to the register $ x $ , indicated as the first operand, the second operand's address. Thus, for example, the "lea ebx, \[eax\]" command will write in the ebx register the content of the eax register: first the \[eax\] operation will be fulfilled, the result of it will be some value that lies in the address written in eax. But we do not need the value — the next operation will be lea, that will take the \[eax\] address, i.e., the value in the eax register, and will write it in ebx. On the first thought the second operation seems meaningless, but as it turns out, it is acceptable to write the operation as lea ecx, \[eax + ebx\], lea ecx, \[k\*eax\] or even lea ecx, \[ebx + k\*eax\], where k = 1, 2, 4 or 8. As a result, the register ecx will be equal to the numbers eax + ebx, k\*eax and ebx + k\*eax correspondingly. However, such operation is fulfilled many times, dozens of times faster that the usual multiplying of numbers. And using several such operations, one can very quickly multiply some number by some other one. Of course, instead of eax, ebx and ecx you are allowed to use any registers. For example, let the eax register contain some number that we should multiply by 41. It takes us 2 lines: lea ebx, \[eax + 4\*eax\] // now ebx = 5\*eax lea eax, \[eax + 8\*ebx\] // now eax = eax + 8\*ebx = 41\*eax Igor K. got interested in the following question: what is the minimum number of lea operations needed to multiply by the given number $ n $ and how to do it? Your task is to help him. Consider that at the initial moment of time eax contains a number that Igor K. was about to multiply by $ n $ , and the registers from ebx to ezx contain number 0. At the final moment of time the result can be located in any register.

输入输出格式

输入格式


The input data contain the only integer $ n $ ( $ 1<=n<=255 $ ), which Igor K. is about to multiply.

输出格式


On the first line print number $ p $ , which represents the minimum number of lea operations, needed to do that. Then print the program consisting of $ p $ commands, performing the operations. It is guaranteed that such program exists for any $ n $ from 1 to 255. Use precisely the following format of commands (here $ k $ is equal to 1, 2, 4 or 8, and $ x $ , $ y $ and $ z $ are any, even coinciding registers): lea x, \[y\] lea x, \[y + z\] lea x, \[k\*y\] lea x, \[y + k\*z\] Please note that extra spaces at the end of a command are unacceptable.

输入输出样例

输入样例 #1

41

输出样例 #1

2
lea ebx, [eax + 4*eax]
lea ecx, [eax + 8*ebx]

输入样例 #2

2

输出样例 #2

1
lea ebx, [eax + eax]

输入样例 #3

4

输出样例 #3

1
lea ebx, [4*eax]

Input

题意翻译

你有 `eax,ebx,ecx,...,ezx` 这26个寄存器,初始 `eax` 中会有一个数,其余为 $0$。 定义一个指令序列包含以下四类指令: - `lea x, [y]` 将寄存器 $y$ 中的值赋给寄存器 $x$。 - `lea x, [y + z]` 将寄存器 $y$ 与 $z$ 中的值之和赋给寄存器 $x$。 - `lea x, [k*y]` 将寄存器 $y$ 中的值的 $k$ 倍赋给寄存器 $x$。 - `lea x, [y + k*z]` 将寄存器 $y$ 中的值的 $k$ 倍与寄存器 $z$ 中的值之和赋给寄存器 $x$。 注意,这里的 `k=1,2,4,8`,`x,y,z` 可以为任意寄存器。 输入一个数 $n$ 满足 $1 ≤ n ≤ 255$ 。表示需要将寄存器 `eax` 中的数变成原来的 $n$ 倍(只要末状态存在一个寄存器,其中的值为此值即可) 输出行数最少的任意的指令序列,不能有行末空格。

加入题单

上一题 下一题 算法标签: