Problem: 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.

Input

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

Output

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.

Examples

Input

41


Output

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


Input

2


Output

1
lea ebx, [eax + eax]


Input

4


Output

1
lea ebx, [4*eax]

Solution (in JAVA):

Solution:


import java.awt.Point;
import java.io.*;
import java.math.BigInteger;
import java.util.*;
import static java.lang.Math.*;

public class ProblemE_76 {
	
	final boolean ONLINE_JUDGE = System.getProperty("ONLINE_JUDGE")!=null;
	BufferedReader in;
	PrintWriter out;
	StringTokenizer tok = new StringTokenizer("");
	
	void init() throws FileNotFoundException{
		if (ONLINE_JUDGE){
			in = new BufferedReader(new InputStreamReader(System.in));
			out = new PrintWriter(System.out);
		}else{
			in = new BufferedReader(new FileReader("input.txt"));
			out = new PrintWriter("output.txt");
		}
	}
	
	String readString() throws IOException{
		while(!tok.hasMoreTokens()){
			tok = new StringTokenizer(in.readLine());
		}
		return tok.nextToken();
	}
	
	int readInt() throws IOException{
		return Integer.parseInt(readString());
	}
	
	long readLong() throws IOException{
		return Long.parseLong(readString());
	}
	
	double readDouble() throws IOException{
		return Double.parseDouble(readString());
	}
	
	public static void main(String[] args){
		new ProblemE_76().run();
	}
	
	public void run(){
		try{
			long t1 = System.currentTimeMillis();
			init();
			solve();
			out.close();
			long t2 = System.currentTimeMillis();
			System.err.println("Time = "+(t2-t1));
		}catch (Exception e){
			e.printStackTrace(System.err);
			System.exit(-1);
		}
	}
	
	class Register implements Comparable<Register>{
		
		char c;
		int value;
		String way;
		ArrayList<Register> list;
		
		public Register(){
			c = '0';
			value = 0;
			way = "";
			list = new ArrayList<ProblemE_76.Register>();
			list.add(this);
		}
		
		public Register(int value){
			c = 'a';
			this.value = value;
			way = "";
			list = new Register().list;
			list.add(this);
		}
		
		public Register(int i, Register r1, int k, Register r2){
			this.c = (char) i;
			value = r1.value + k * r2.value;
			way = "lea e" + c + "x, [";
			if (r1.value != 0) way += "e" + r1.c + "x + ";
			if (k != 1) way += Integer.toString(k) + "*";
			way += "e" + r2.c + "x]";
			if (r1.c < r2.c){
				list = new ArrayList<ProblemE_76.Register>(r2.list);
			}else{
				list = new ArrayList<ProblemE_76.Register>(r1.list);
			}
			list.add(this);
		}

		@Override
		public int compareTo(Register r) {
			return value - r.value;
		}
	}
	
	int n;
	Register zero = new Register();
	Register one = new Register(1);
	
	void solve() throws IOException{
		n = readInt();
		if (n == 1){
			out.print(0);
			return;
		}
		Register min = bfs(one);
		out.println(min.c - 'a');
		ArrayList<String> route = new ArrayList<String>();
		for (int i = 2; i < min.list.size(); i++){
			route.add(min.list.get(i).way);
		}
		for (int i = 0; i < route.size(); i++){
			out.println(route.get(i));
		}
	}
	
	Register bfs(Register begin){
		TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
		map.put(begin.value, 0);
		ArrayDeque<Register> q = new ArrayDeque<ProblemE_76.Register>();
		q.add(begin);
		int[] k = {1, 2, 4, 8};
		ArrayList<Register> list = new ArrayList<ProblemE_76.Register>();
		Register r;
		while (q.size() != 0){
			Register r1 = q.poll();
			list = r1.list;
			for (Register r2: list){
				for (int i = 0; i < 4; i++){
					r = new Register(r1.c + 1, r1, k[i], r2);
					if (r.value == n)
						return r;
					Integer d = map.get(r.value);
					if (d == null || (int) d == r.c - 'a'){
						q.add(r);
						if (d == null) map.put(r.value, r.c - 'a');
					}
					r = new Register(r1.c + 1, r2, k[i], r1);
					if (r.value == n) 
						return r;
					d = map.get(r.value);
					if (d == null || (int) d == r.c - 'a'){
						q.add(r);
						if (d == null) map.put(r.value, r.c - 'a');
					}
				}
			}
		}
		return zero;
	}
	
	static int[][] step8 = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {1, -1}, {-1, 1}, {1, 1}};
	
	static int[][] stepKnight = {{-2, -1}, {-2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {1, 2}, {2, -1}, {2, 1}};
	
	static long gcd(long a, long b){
		if (a == 0)	return b;
		return gcd(b % a, a);
	}
	
	static long lcm(long a, long b){
		return a / gcd(a, b)*b;
	}

	static long[] gcdPlus(long a, long b){
		long[] d = new long[3];
		if (a == 0){
			d[0] = b;
			d[1] = 0;
			d[2] = 1;
		}else{
			d = gcdPlus(b % a, a);
			long r = d[1];
			d[1] = d[2] - b/a*d[1];
			d[2] = r;
		}
		return d;
	}
	
	static long binpow(long a, int n){
		if (n == 0)	return 1;
		if ((n & 1) == 0){
			long b = binpow(a, n/2);
			return b*b;
		}else return binpow(a, n - 1)*a;
	}
	
	static long binpowmod(long a, int n, long m){
		if (m == 1) return 0;
		if (n == 0)	return 1;
		if ((n & 1) == 0){
			long b = binpowmod(a, n/2, m);
			return (b*b) % m;
		}else return binpowmod(a, n - 1, m)*a % m;
	}
	
	static long phi(long n){
		int[] p = Sieve((int)ceil(sqrt(n)) + 2);
		long phi = 1;
		for (int i = 0; i < p.length; i++){
			long x = 1;
			while (n % p[i] == 0){
				n /= p[i];
				x *= p[i];
			}
			phi *= x - x/p[i];
		}
		if (n != 1) phi *= n - 1;
		return phi;
	}
	
	static long f(long n, int x, int k){ //���-�� ���������� ����� (������� 0), ���������� � ���� ����� �� 0 �� k-1
		if (n == 0)	return 1;
		long b = binpow(10, x - 1);
		long c = n / b;
		return (c < k? c: k)*binpow(k, x - 1) + (c < k? 1: 0)*f(n % b, x - 1, k);
	}
	
	static long fib(int n){
		if (n == 0) return 0;
		if ((n & 1) == 0){
			long f1 = fib(n/2 - 1);
			long f2 = fib(n/2 + 1);
			return f2*f2 - f1*f1;
		}else{
			long f1 = fib(n/2);
			long f2 = fib(n/2 + 1);
			return f1*f1 + f2*f2;
		}
	}
	
	static BigInteger BigFib(int n){
		if (n == 0) return BigInteger.ZERO;
		if ((n & 1) == 0){
			BigInteger f1 = BigFib(n/2 - 1);
			f1 = f1.multiply(f1);
			BigInteger f2 = BigFib(n/2 + 1);
			f2 = f2.multiply(f2);
			return f2.subtract(f1);
		}else{
			BigInteger f1 = BigFib(n/2);
			f1 = f1.multiply(f1);
			BigInteger f2 = BigFib(n/2 + 1);
			f2 = f2.multiply(f2);
			return f2.add(f1);
		}
	}
	
	static public class PointD{
		
		double x, y;
		
		public PointD(double x, double y){
			this.x = x;
			this.y = y;
		}
	}
	
	static double d(Point p1, Point p2){
		return sqrt(d2(p1, p2));
	}
	
	static public double d(PointD p1, PointD p2){
		return sqrt(d2(p1, p2));
	}
	
	static double d2(Point p1, Point p2){
		return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
	}
	
	static public double d2(PointD p1, PointD p2){
		return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
	}
	
	static boolean IsProbablyPrime(long n){
		if (n == 1)	return false;
		if ((n & 1) == 0) return false;
		for (int j = 3; j < sqrt(n) + 1; j += 2){
			if (n % j == 0)	return false;
		}
		return true;
	}

	static int[] Sieve(int n){
		boolean[] b = new boolean[n+1];
		Arrays.fill(b, true);
		b[0] = false;
		b[1] = false;
		long nLong = n;
		int j=0;
		for (int i = 1; i <= n; i++) {
			if (b[i]){
				j++;
				if (((long)i)*i <= nLong) {
					for (int k = i*i; k <= n; k += i) {
						b[k] = false;
					}
				}
			}
		}
		int[] p = new int[j];
		Arrays.fill(p, 0);
		j=0;
		for (int i = 2; i <= n; i++) {
			if (b[i]){
				p[j]=i;
				j++;
			}
		}
		return p;
	}
	
	static int[][] Palindromes(String s){
		char[] c = s.toCharArray();
		int n = c.length;
		int[][] d = new int[2][n];
		int l = 0, r = -1;
		for (int i = 0; i < n; i++){
			int j = (i > r? 0: min(d[0][l+r-i+1], r-i+1)) + 1;
			for (; i - j >= 0 && i + j - 1< n && c[i-j] == c[i+j-1]; j++);
			d[0][i] = --j;
			if (i + d[0][i] - 1 > r){
				r = i + d[0][i] - 1;
				l = i - d[0][i];
			}
		}
		l = 0;
		r = -1;
		for (int i = 0; i < n; i++){
			int j = (i > r? 0: min(d[1][l+r-i], r-i)) + 1;
			for (; i - j >= 0 && i + j < n && c[i-j] == c[i+j]; j++);
			d[1][i] = --j;
			if (i + d[1][i] > r){
				r = i + d[1][i];
				l = i - d[1][i];
			}
		}
		return d;
	}
	
	static public class Permutation {
		
		int[] a;
		int n;
		
		public Permutation(int n){
			this.n=n;
			a=new int[n];
			for (int i=0; i<n; i++){
				a[i]=i;
			}
		}
		
		public boolean nextPermutation(){ //������� � do{}while(nextPermutation(a));
			int i=n-1;
			for (i=n-2; i>=0; i--){
				if (a[i]<a[i+1]){
					break;
				}
			}
			if (i==-1){
				return false;
			}
			int jMin=i+1;
			for (int j=n-1; j>i; j--){
				if (a[i]<a[j]&&a[j]<a[jMin]){
					jMin=j;
				}
			}
			swap(i, jMin);
			for (int j=1; j<=(n-i)/2; j++){
				swap(i+j, n-j);
			}
			return true;
		}
		
		
		public int get(int i){
			return a[i];
		}
		
		void swap(int i, int j){
			int r=a[i];
			a[i]=a[j];
			a[j]=r;
		}
	}
	
	static public class Fraction implements Comparable<Fraction>, Cloneable{
		
		public final Fraction FRACTION_ZERO = new Fraction();
		public final Fraction FRACTION_ONE = new Fraction(1);
		public long numerator = 0;
		public long denominator = 1;
		
		public Fraction(){
			numerator = 0;
			denominator = 1;
		}
		
		public Fraction(long numerator){
			this.numerator = numerator;
			denominator = 1;
		}
		
		public Fraction(long numerator, long denominator){
			this.numerator = numerator;
			this.denominator = denominator;
			Cancellation();
		}
		
		public Fraction(double numerator, double denominator, int accuracy){
			this.numerator = (long)(numerator*pow(10,accuracy));
			this.denominator = (long)(denominator*pow(10,accuracy));
			Cancellation();
		}
		
		public Fraction(String s){
			if (s.charAt(0) == '-'){
				denominator = -1;
				s = s.substring(1);
			}
			if (s.indexOf("/") != -1){
				denominator *= Integer.parseInt(s.substring(s.indexOf("/") + 1));
			}
			if (s.indexOf(" ") != -1){
				numerator = Integer.parseInt(s.substring(0, s.indexOf(" "))) * abs(denominator) + Integer.parseInt(s.substring(s.indexOf(" ") + 1, s.indexOf("/")));
			}else{
				if (s.indexOf("/") != -1){
					numerator = Integer.parseInt(s.substring(0, s.indexOf("/")));
				}else{
					numerator = Integer.parseInt(s)*abs(denominator);
				}
			}
			this.Cancellation();
		}
		
		void Cancellation(){
			long g = gcd(abs(numerator), abs(denominator));
			numerator /= g;
			denominator /= g;
			if (denominator < 0){
				numerator *= -1;
				denominator *= -1;
			}
		}
		
		public String toString(){
			String s = "";
			if (numerator == 0){
				return "0";
			}
			if (numerator < 0){
				s += "-";
			}
			if (abs(numerator) >= denominator){
				s += Long.toString(abs(numerator) / denominator) + " ";
			}
			if (abs(numerator) % denominator != 0){
				s += Long.toString(abs(numerator) % denominator);
			}else{
				s = s.substring(0, s.length()-1);
			}
			if (denominator != 1){
				s += "/" + Long.toString(denominator);
			}
			return s;
		}
		
		public Fraction add(Fraction f){
			Fraction fResult = new Fraction();
			fResult.denominator = lcm(denominator, f.denominator);
			fResult.numerator = numerator * fResult.denominator / denominator + f.numerator * fResult.denominator / f.denominator;
			fResult.Cancellation();
			return fResult;
		}
		
		public Fraction subtract(Fraction f){
			Fraction fResult = new Fraction();
			fResult.denominator = lcm(denominator, f.denominator);
			fResult.numerator = numerator * fResult.denominator / denominator - f.numerator * fResult.denominator / f.denominator;
			fResult.Cancellation();
			return fResult;
		}
		
		public Fraction multiply(Fraction f){
			Fraction fResult = new Fraction();
			fResult.numerator = numerator * f.numerator;
			fResult.denominator = denominator * f.denominator;
			fResult.Cancellation();
			return fResult;
		}
		
		public Fraction divide(Fraction f){
			Fraction fResult = new Fraction();
			fResult.numerator = numerator * f.denominator;
			fResult.denominator = denominator * f.numerator;
			fResult.Cancellation();
			return fResult;
		}
		
		@Override
		public int compareTo(Fraction f){
			long g = gcd(denominator, f.denominator);
			long res = numerator * (f.denominator / g) - f.numerator * (denominator / g);
			if (res < 0){
				return -1;
			}
			if (res > 0){
				return 1;
			}
			return 0;
		}
		
		public Fraction clone(){
			Fraction fResult = new Fraction(numerator, denominator);
			return fResult;
		}
		
		public Fraction floor(){
			Fraction fResult = this.clone();
			fResult.numerator = (fResult.numerator / fResult.denominator) * fResult.denominator;
			return fResult;
		}
		
		public Fraction ceil(){
			Fraction fResult = this.clone();
			fResult.numerator = (fResult.numerator/fResult.denominator + 1) * fResult.denominator;
			return fResult;
		}
		
		public Fraction binpow(int n){
			if (n==0) return FRACTION_ONE;
			if ((n&1)==0){
				Fraction f=this.binpow(n/2);
				return f.multiply(f);
			}else return binpow(n-1).multiply(this);
		}
	}
	
	static public class FenwickTree_1{	//One-dimensional array		
		
		int n;
		long[] t;
		
		public FenwickTree_1(int n){
			this.n = n;
			t = new long[n];
		}
		
		public long sum(int xl, int xr){
			return sum(xr) - sum(xl);
		}
		
		public long sum(int x){
			long result = 0;
			for (int i = x; i >= 0; i = (i & (i + 1)) - 1){
				result += t[i];
			}
			return result;
		}
		
		public void update(int x, long delta){
			for (int i = x; i < n; i = (i | (i + 1))){
				t[i] += delta;
			}
		}
	}
	
	static public class FenwickTree_2{	//Two-dimensional array
		
		int n, m;
		long[][] t;
		
		public FenwickTree_2(int n, int m){
			this.n = n;
			this.m = m;
			t = new long[n][m];
		}
		
		public long sum(int xl, int yl, int xr, int yr){
			return sum(xr, yr) - sum(xl - 1, yr) - sum(xr, yl - 1) + sum(xl - 1, yl - 1);
		}
		
		public long sum(int x, int y){
			long result = 0;
			for (int i = x; i >= 0; i = (i & (i + 1)) - 1){
				for (int j = y; j >= 0; j = (j & (j + 1)) - 1){
					result+=t[i][j];
				}
			}
			return result;
		}
		
		public void update(int x, int y, long delta){
			for (int i = x; i < n; i = (i | (i + 1))){
				for (int j = y; j < m; j = (j | (j + 1))){
					t[i][j] += delta;
				}
			}
		}
	}
	
	static public class FenwickTree_3{	//Three-dimensional array
		
		int n, m, l;
		long[][][] t;
		
		public FenwickTree_3(int n, int m, int l){
			this.n = n;
			this.m = m;
			this.l = l;
			t = new long[n][m][l];
		}
		
		public long sum(int xl, int yl, int zl, int xr, int yr, int zr){
			return sum(xr, yr, zr) - sum(xl - 1, yr, zr)
			+ sum(xl - 1, yr, zl - 1) - sum(xr, yr, zl - 1)
			- sum(xr, yl - 1, zr) + sum(xl - 1, yl - 1, zr)
			- sum(xl - 1, yl - 1, zl - 1) + sum(xr, yl - 1, zl - 1);
		}
		
		public long sum(int x, int y, int z){
			long result = 0;
			for (int i = x; i >= 0; i = (i & (i + 1)) - 1){
				for (int j = y; j >= 0; j = (j & (j + 1)) - 1){
					for (int k = z; k >= 0; k = (k & (k + 1)) - 1){
						result += t[i][j][k];
					}
				}
			}
			return result;
		}
		
		public void update(int x, int y, int z, long delta){
			for (int i = x; i < n; i = (i | (i + 1))){
				for (int j = y; j < n; j = (j | (j + 1))){
					for (int k = z; k < n; k = (k | (k + 1))){
						t[i][j][k] += delta;
					}
				}
			}
		}
	}
}