using System;
using System.Collections;
using System.Collections.Generic;
public class Program
{
  //取得num的因数,装在stack中
    public static void div(int num, Stack<int> stack)
    {
        stack.Clear();
        double temp = Math.Sqrt(num);
        for (int i = 2; i <= temp; i++)
        {
            if(num % i == 0 && i == temp)
            {
                stack.Push(i);
            }
            else if(num % i == 0)
            {
                stack.Push(i);
                stack.Push(num / i);
            }
        }
    }
    public static void Main()
    {
        string line;
        while ((line = Console.ReadLine()) != null)
        { // 注意 while 处理多个 case
            string[] tokens = line.Split(' ');
            int n = int.Parse(tokens[0]);
            int m = int.Parse(tokens[1]);
            //BFS
            int[] ans = new int[m + 1]; //ans[x]代表到达x需要最少需要多少步
            ArrayList.Repeat(int.MaxValue, m + 1).CopyTo(ans);
            ans[n] = 0;
            //从n出发,遍历每个当前数可以到达的数,若该数未到达过,ans[stack.Peek()] =ans[i] + 1,到达过则比较大小,选小的赋值
            Stack<int> s = new Stack<int>();//用来装因数
            Queue<int> q = new Queue<int>();//用来做BFS
            q.Enqueue(n);
            while (q.Count != 0)
            {
                int i = q.Dequeue();
                div(i, s);
                while (s.Count != 0)
                {
                    int j = s.Pop();
                    if (i + j > m) continue;
                    if (ans[i + j] == int.MaxValue)//未访问过该点
                    {
                        ans[i + j] = ans[i] + 1;
                        q.Enqueue(i + j);
                    }
                    else
                    {
                        if (ans[i + j] > ans[i] + 1) ans[i + j] = ans[i] + 1;
                    }
                }
            }
            if (ans[m] == int.MaxValue) ans[m] = -1;//若m未访问到则赋值-1
            Console.WriteLine(ans[m]);
        }
        
    }
}

用BFS来做