#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<ll,ll>;
queue<PII> q;
// 算法思想:使用map做状态去重,避免重复探索同一(X,Y)状态,防止无限循环
// 优势:天然支持负数、大数,无需边界映射,比固定数组更灵活
map<pair<ll, ll>, bool> a;
void bfs(ll X, ll Y) {
// 算法思想:BFS初始化,将初始状态入队,标记为已访问
// BFS的核心是"先进先出",保证按步骤顺序探索,天然适合寻找"最少操作步骤"
q.push({X, Y});
a[{X, Y}] = true;
ll cnt = 0; // 记录最少操作步骤,对应BFS的遍历层数
bool found = false; // 标记是否找到目标状态(X==Y)
// 算法思想:设置合理的搜索步骤上限,避免对"永远无法达成目标"的状态无限探索
// 有效样例的步骤数极少,20步足够覆盖所有可行情况,防止程序卡死
const int MAX_STEP = 20;
// 算法思想:BFS主循环,两个终止条件:队列空(无状态可探索)、达到步骤上限(无可行解)
// 按"层"遍历,每一层对应一步操作,保证步骤数最少
while (!q.empty() && cnt < MAX_STEP) {
// 算法思想:记录当前层的节点数,实现BFS的"按层遍历"
// 每一层对应一次操作步骤,遍历完一层即完成一步,cnt累加一次
ll size = q.size();
found = false;
// 算法思想:遍历当前层的所有状态,逐一处理并生成下一层状态
for (ll i = 0; i < size; i++) {
ll x = q.front().first;
ll y = q.front().second;
q.pop();
// 算法思想:目标状态判断,找到即标记并跳出,无需继续探索
// BFS按层遍历,首次找到的即为"最少步骤",直接终止即可
if (x == y) {
found = true;
break;
}
// 操作1:交换两个数,生成新状态
// 算法思想:遍历所有合法操作,生成下一层待探索状态,保证状态不遗漏
ll nx1 = y, ny1 = x;
if (a.find({nx1, ny1}) == a.end()) { // 判断新状态是否未被访问,避免重复
a[{nx1, ny1}] = true; // 标记为已访问,防止后续重复入队
q.push({nx1, ny1}); // 新状态入队,等待下一层遍历(对应下一步操作)
}
// 操作2:变换生成(x+y, x-y),生成新状态
// 算法思想:遍历所有合法操作,生成下一层待探索状态,保证状态不遗漏
ll nx2 = x + y, ny2 = x - y;
if (a.find({nx2, ny2}) == a.end()) { // 判断新状态是否未被访问,避免重复
a[{nx2, ny2}] = true; // 标记为已访问,防止后续重复入队
q.push({nx2, ny2}); // 新状态入队,等待下一层遍历(对应下一步操作)
}
}
// 算法思想:当前层找到目标状态,直接跳出循环,停止后续层的探索
if (found) break;
// 算法思想:当前层遍历完毕且未找到目标,步骤数+1,进入下一层探索
// 每一层对应一步操作,cnt累加保证步骤数的准确性(最少步骤)
cnt++;
}
// 算法思想:结果输出,找到目标输出最少步骤,否则输出-1表示无可行解
if (found) {
cout << cnt;
} else {
cout << -1;
}
}
int main() {
ll X,Y;
cin>>X>>Y;
// 前置快速判断:初始状态已达标,直接输出0步,避免无用的BFS探索
if(X==Y){
cout<<0;
return 0;
}
// 调用BFS进行核心探索,寻找最少操作步骤
bfs(X,Y);
return 0;
}