#include <climits> #include <iostream> #include <vector> using namespace std; //求约数 void get_y(vector<int>& v, int x) { for(int i = 2; i * i <= x; i++) { if(x % i == 0) { v.push_back(i); if(x / i != i) v.push_back(x / i); } } } int jump(int n, int m) { vector<int> step(m + 1, INT_MAX); step[n] = 0;//初始化第一个位置 for(int i = n; i < m; i++) { if(step[i] == INT_MAX) continue; vector<int> v;//存约数 get_y(v, i); for(int j = 0; j < v.size(); j++) { //如果不是第一次到这里 if(i + v[j] <= m && step[i + v[j]] != INT_MAX) { //新的和旧的比较谁的步数少 step[i + v[j]] = step[i + v[j]] > step[i] + 1 ? step[i] + 1 : step[i + v[j]]; } else if(i + v[j] <= m) { //如果是第一次来就直接赋值 step[i + v[j]] = step[i] + 1; } } } //如果该位置被赋值,证明找到了,返回该位置的值即可 return step[m] == INT_MAX ? -1 :step[m]; } int main() { int n, m, min_step; cin >> n >> m; min_step = jump(n, m); cout << min_step << endl; return 0; }