#include<stdio.h>
#include<string.h>
const int maxn=100001;
bool vis[maxn];//记录是否遍历过
int n,k; //n为人位置,k为牛位置
struct Node
{
int x,step; //x记录现在的位置,step记录现在的步数
};
Node q[maxn]; //记录走路历程的数组
int bfs()
{
int i;
Node now,next; //now记录现在时刻状态,可以不用now直接使用head,在循环最后加head++.
//next记录,下一阶段要经历的状态
int head,tail; //head队首元素,tail是下一个要检查的元素
head=tail=0; //因tail元素还没赋值现将二者初始化为零相等
q[tail].x=n;//
q[tail].step=0;tail++;//tail元素赋值,并让tail成为下一元素,原tail元素成为队首元素
vis[n]=true;//将遍历记录数组全初始化为可遍历状态即未曾到过这个遍历点
//这个这个数组要理解是记录什么的,每一个点都代表着这个位置,被遍历过成为不可遍历状态后即认为从起点到达这个点的最短次数已经确定,所以后面无论什么方法到达这里都会比初始方法快捷,所以不必再遍历这个点.
while(head<tail)//我的理解相当于是无限循环,直到找到最优解主动跳出循环.
{
now=q[head];//此处可改,为了观赏效果,用now承接队首元素数据
head++;
for(i=0;i<3;i++)//一共有三种走法,所以循环三次每一次都代表不同走法
{
if(i==0) next.x=now.x-1;
else if(i==1) next.x=now.x+1;
else next.x=2*now.x;//三种走法对坐标的改变,用next承接改变后的数据
if(next.x<0 || next.x>=maxn) continue;
//用来限制条件排除越界,这个剪枝的意思大概就是让已经知道没用的解就直接别浪费时间算下去了
if(!vis[next.x])//这一步就体现到这个数组的理解了,只记录第一个到这一位置的走法
{
vis[next.x]=true;//将这一位置设为不可遍历状态
next.step=now.step+1;//到了这一位置,所以步数比上一次加一
q[tail].x=next.x;q[tail].step=next.step;tail++;
//tail记录的是下一个要被用作当前状态(即下一个head)的元素,所以用它承接next的值,同时++
if(next.x==k) return next.step;
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(vis,false,sizeof(vis));
if(n>=k) printf("%d\n",n-k);
else printf("%d\n",bfs());
}
return 0;
}