N,M=map(int,input().split()) #一番うしろが一番大きくなる。 #N=10**9なので実際にAを構成することはできない #A[i-1]=A[i]/2 or (A[i]+1)/2なので、実はA[i]が決まればA[i-1]はユニークに決まる。よってA[N-1]を決め打ちして、前までさかのぼってA[1]=1となるようなもののうちA[N-1]の最大を探す #A[N-1]=Mからスタートして1になるまで繰り返す。1になるまでにAが全部完成すればNをへらす。 #途中で1になるならそれでおわる。半分ずつになるのでO(log(N))程度の時間で終わるはず #A[N-1]=xとして、A[1]=1になるかどうか。これはO(log(N)) def C(x): cnt=0 while x!=1: cnt+=1 if x%2==0: x//=2 else: x=(x+1)//2 if cnt1: mid=left+(right-left)//2 if C(mid): #TrueならもっとふやしてもOK left=mid else: right=mid #A[-1]=leftで確定なので、このときの和を求めます n=left les=n #cntはlesに後ろからcnt項ぶんたされたことを示す。最初にnをいれておくとN,M=1でもOKになるのでね。 cnt=1 #1になるまでループ while n!=1: if n%2==0: n//=2 else: n=(n+1)//2 les+=n cnt+=1 if cnt>=N: #Nを超えたらbreak break if cnt>=N: #この場合はこれで終わりです。 print(les) else: #この場合は残りの1を足す print(les+(N-cnt))