#include <iostream>
using namespace std;
int main()
{
int d,n,i,k;
while(cin>>d>>n && !(d==0 && n==0)){
k=1;
for(i=0;i<d-1;i++){ //共有n层
if(n%2){ //在每一层上,猴子往左走(n为奇数)
k=k*2;
n=(n+1)/2;
}
else{ //在每一层上,猴子往右走(n为偶数)
k=k*2+1;
n=n/2;
}
}
cout<<k<<endl;
}
return 0;
}
总结:满二叉树上的小球下落问题。
对于二叉树的每棵树:左子树=它的根的2倍,右子树=它的根的2倍+1;
每走一层,n就变为原来的1/2;这里不好表达,不过按照代码去理解一下程序的整个流程就明白是什么意思了,很好理解。
还有就是这个题的数据不大,所以可以暴力直接解决。一直模拟整个步骤就行。