题目不难,但是要总结规律。对于第一个节点,第一个球肯定是向左的,第二个球向右。然后第三个球向左,第四个球向右,这样依次类推,那么对于根节点的左孩子,那么根节点的第一个球肯定是向左,根节点的第三个球是向右,那么根节点的第一个球相对与左孩子而言也是其第一个球,根节点的第三个球相对于左孩子而言是第二个球,同理,对于根节点的右孩子,根节点的第二个球是其第一个球,第四个球是其第二个球,那么依次类推,对于根节点的第i个球,如果i为奇数,那么该球就向左边下落,对于左孩子而言是其第(i+1)/2个球,如果i为偶数,就向右节点下落,并且相对于右孩子而言,是其第i/2个节点。
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
using namespace std;
int L;
int main(){
cin >> L;
int D, I;
while (L){
cin >> D >> I;
if (D == -1) break;
int number = 1;
for (int i = 1; i < D; i++){
if (I % 2 == 0){
number = number * 2 + 1;
I = I / 2;
}
else{
number = number * 2;
I = (I + 1) / 2;
}
}
cout << number << endl;
L--;
}
return 0;
}