Memory is now interested in the de-evolution of objects, specifically triangles. He starts with an equilateral triangle of side length x, and he wishes to perform operations to obtain an equilateral triangle of side length y.

In a single second, he can modify the length of a single side of the current triangle such that it remains a non-degenerate triangle (triangle of positive area). At any moment of time, the length of each side should be integer.

What is the minimum number of seconds required for Memory to obtain the equilateral triangle of side length y?

Input

The first and only line contains two integers x and y (3 ≤ y < x ≤ 100 000) — the starting and ending equilateral triangle side lengths respectively.

Output

Print a single integer — the minimum number of seconds required for Memory to obtain the equilateral triangle of side length y if he starts with the equilateral triangle of side length x.

Examples

Input

6 3


Output

4


Input

8 5


Output

3


Input

22 4


Output

6

Note

In the first sample test, Memory starts with an equilateral triangle of side length 6 and wants one of side length 3. Denote a triangle with sides a, b, and c as (a, b, c). Then, Memory can do <image>.

In the second sample test, Memory can do <image>.

In the third sample test, Memory can do: <image>

<image>.
	import java.io.BufferedReader;
	import java.io.IOException;
	import java.io.InputStreamReader;
	import java.util.ArrayList;
	import java.util.Arrays;
	import java.util.Collections;
	import java.util.Comparator;
	import java.util.HashMap;
	import java.util.StringTokenizer;
	public class Solution123{
		static int coun = 0;
		static int size = 0;
		public static void main(String[] args) throws IOException{
			FastReader sc = new FastReader();
			int a = sc.nextInt();
			int b = sc.nextInt();
			int[] arr = new int[3];
			arr[0] = b;
			arr[1]  = b;
			arr[2] = b;
			int count = 0;
			while(arr[0] < a || arr[1] < a || arr[2] < a){
				arr[count%3] = arr[(count + 1)%3] + arr[(count + 2)%3] - 1;
				count++;
			}
			System.out.println(count);
		}
		public static int complement(int index){
			if(index == 0){
				return 1;
			}
			return 0;
		}
		private static long gcd(long a, long b)
		{
		    while (b > 0)
		    {
		        long temp = b;
		        b = a % b; // % is remainder
		        a = temp;
		    }
		    return a;
		}
		void convertDegree(){
			
		}
		private static long gcd(long[] input)
		{
		    long result = input[0];
		    for(int i = 1; i < input.length; i++) result = gcd(result, input[i]);
		    return result;
		}
		private static long lcm(long a, long b)
		{
		    return a * (b / gcd(a, b));
		}
	
		private static long lcm(long[] input)
		{
		    long result = input[0];
		    for(int i = 1; i < input.length; i++) result = lcm(result, input[i]);
		    return result;
		}
		public static boolean[] sieveAlgo(int n){
			boolean isPrime[] = new boolean[n + 1];
			for (int i = 2; i <= n; i++) {
	            isPrime[i] = true;
	        }
	
	        // mark non-primes <= n using Sieve of Eratosthenes
	        for (int factor = 2; factor*factor <= n; factor++) {
	
	            // if factor is prime, then mark multiples of factor as nonprime
	            // suffices to consider mutiples factor, factor+1, ...,  n/factor
	            if (isPrime[factor]) {
	                for (int j = factor; factor*j <= n; j++) {
	                    isPrime[factor*j] = false;
	                }
	            }
	        }
	        return isPrime;
		}
		public static int binarySearch(int[] arr,int low,int high,int key){
			while(low <= high){
				int mid = (low + high)/2;
				if(arr[mid] == key){
					return mid;
				}else if(arr[mid] < key){
					low = mid + 1;
				}else{
					high = mid - 1;
				}
			}
			return -1;
		}
		public static int ternarySearch(int[] arr,int l,int r,int key){
			if(r >= l){
				int mid1 = l + (r-1)/3;
				int mid2 = r - (r-1)/3;
				if(arr[mid1] == key){
					return mid1;
				}else if(arr[mid2] == key){
					return mid2;
				}
				if(key < arr[mid1]){
					return ternarySearch(arr,l,mid1-1,key);
				}else if(key > arr[mid2]){
					return ternarySearch(arr,mid2 + 1,r,key);
				}else{
					return ternarySearch(arr,mid1 + 1,mid2 - 1,key);
				}
			}
			return -1;
		}
		public static double fun(double x){
			return 2 * x * x - 12 * x + 7;
		}
		
		public static double tsModified(double start,double end){
			double l = start;
			double r = end;
			for(int i = 0;i < 200;i++){
				double mid1 = (l * 2 + r)/3;
				double mid2 = (l + 2 * r)/3;
				if(fun(mid1) < fun(mid2)){
					r = mid2;
				}else{
					l = mid1;
				}
			}
			double x = l;
			return fun(x);
		}
		public static String fmt(double d)
		{
		    if(d == (long) d)
		        return String.format("%d",(long)d);
		    else
		        return String.format("%s",d);
		}
		public static int[][] comparator(int[][] arr){
			Arrays.sort(arr, new Comparator<int[]>() {
	            @Override
	            public int compare(int[] a,int[] b) {
	                Integer a1 = a[1];
	                Integer b1 = b[1];
	            	return b1.compareTo(a1);
	            }
	        });
			return arr;
		}
		public static StringBuilder[][] comparator2(StringBuilder[][] arr){
			Arrays.sort(arr, new Comparator<StringBuilder[]>() {
	            @Override
	            public int compare(StringBuilder[] a,StringBuilder[] b) {
	                StringBuilder a1 = a[0];
	                StringBuilder b1 = b[0];
	            	return a1.toString().compareTo(b1.toString());
	            }
	        });
			return arr;
		}
		public static int[][] comparator2(int[][] arr){
			Arrays.sort(arr, new Comparator<int[]>() {
	            @Override
	            public int compare(int[] a,int[] b) {
	                Integer a1 = a[0];
	                Integer b1 = b[0];
	            	return b1.compareTo(a1);
	            }
	        });
			return arr;
		}
		static class FastReader
	    {
	        BufferedReader br;
	        StringTokenizer st;
	 
	        public FastReader()
	        {
	            br = new BufferedReader(new
	                     InputStreamReader(System.in));
	        }
	 
	        String next()
	        {
	            while (st == null || !st.hasMoreElements())
	            {
	                try
	                {
	                    st = new StringTokenizer(br.readLine());
	                }
	                catch (IOException  e)
	                {
	                    e.printStackTrace();
	                }
	            }
	            return st.nextToken();
	        }
	 
	        int nextInt()
	        {
	            return Integer.parseInt(next());
	        }
	 
	        long nextLong()
	        {
	            return Long.parseLong(next());
	        }
	 
	        double nextDouble()
	        {
	            return Double.parseDouble(next());
	        }
	 
	        String nextLine()
	        {
	            String str = "";
	            try
	            {
	                str = br.readLine();
	            }
	            catch (IOException e)
	            {
	                e.printStackTrace();
	            }
	            return str;
	        }
	    }
		public static String min(int m,int n){
			int[] arr = new int[m];
			arr[0] = 1;
			int sum = 1;
			int j = m - 1;
			for(int i = 1;i <= 18* m + 10;i++){
				if(sum != n){
					if(arr[j] == 9){
						j--;
					}else{
						arr[j]++;
						sum++;
					}
				}
				else{
					break;
				}
			}
			StringBuilder min = new StringBuilder("");
			for(int i = 0;i < arr.length;i++){
				min.append(arr[i]);
			}
			return min.toString();
		}
		public static String max(int m,int n){
			int[] arr = new int[m];
			arr[0] = 1;
			int sum = 1;
			int j = 0;
			for(int i = 1;i <= 9 * m + 10;i++){
				if(sum != n){
					if(arr[j] == 9){
						j++;
					}else{
						arr[j]++;
						sum++;
					}
				}
				else{
					break;
				}
			}
			StringBuilder min = new StringBuilder("");
			for(int i = 0;i < arr.length;i++){
				min.append(arr[i]);
			}
			return min.toString();
		}
	    public static int KMPSearch(String txt,String pat){
			int m = pat.length();
			int n = txt.length();
			int lps[] = new int[m];
			int j = 0;
			int count = 0;
			PrefixTable(pat,m,lps);
			int i = 0;
			while (i < n)
		        {
		            if (pat.charAt(j) == txt.charAt(i))
		            {
		                j++;
		                i++;
		            }
		            if (j == m)
		            {
		            	count++;
		                j = lps[j-1];
		            }
		            else if (i < n && pat.charAt(j) != txt.charAt(i))
		            {
		                if (j != 0)
		                    j = lps[j-1];
		                else
		                    i = i+1;
		            }
		        }
			return count;
		}
		public static void PrefixTable(String pat,int m,int[] lps){
			int len = 0;
			int i = 1;
			lps[0] = 0;
			while(i < m){
				if(pat.charAt(i) == pat.charAt(len)){
					lps[i] = len + 1;
					i++;
					len++;
				}else if(len > 0){
					len = lps[len - 1];
				}else{
					lps[i] = 0;
					i++;
				}
			}
		}
	    public int digit(int x){
	    	int temp = x;
	    	int count = 0;
	    	while(temp != 0){
	    		count++;
	    		temp = temp/10;
	    	}
	    	return count;
	    }
	    public int sum(int x){
	    	int temp = x;
	    	int count = 0;
	    	while(temp != 0){
	    		count += temp % 10;
	    		temp = temp/10;
	    	}
	    	return count;
	    }
	    public int product(int x){
	    	int temp = x;
	    	int count = 1;
	    	while(temp != 0){
	    		count*=temp % 10;
	    		temp = temp/10;
	    	}
	    	return count;
	    }
	    public boolean isValid2(int x){
	    	int temp = x;
	    	while(temp != 0){
	    		if(temp % 10 == 0){
	    			return false;
	    		}
	    		temp = temp/10;
	    	}
	    	return true;
	    }
	    public boolean isValid(int x){
	    	if(!isValid2(x)){
	    		return false;
	    	}else{
	    		if(product(x) <= sum(x)){
	    			return true;
	    		}
	    		return false;
	    	}
	    }
	}