这题属于没想法题。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
ll h,n;
cin>>h>>n;
ll l=0,r=pow(2,h); //或者写成(1ll<<h),ll一定要加!!
int p=0; //表示初始往左走,1表示往右走
ll s=0;
while(h){
ll mid=(l+r)/2; //当前范围的中点
if((n>mid&&p==0)||(n<=mid&&p==1)){ //与题设走法冲突,所以要多走半边子树使方向同步
s+=pow(2,h)-1;
}
else
p=1-p; //默认更换方向,但上面的if特殊,它变换了方向
s++;
if(p==0)
l=mid; //更新范围
else
r=mid;
h--;
}
cout<<s<<endl;
return 0;
}