Description
有一棵满二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从上到下从左到右编号为1,2,3,…,2^D-1。松哥在结点1处放下一个小球,它会往下落。每个结点都会有一个开关,初始全为关闭,当每次有小球落到一个开关上时,开关的状态都会改变(开变关,关变开)。当小球到达某个结点时,如果该结点上的开关关闭,则小球往左走,否则往右走,直到走到叶子结点。现在有n个小球依次从结点1开始往下落,松哥想要知道第n个小球落在哪个结点,你能告诉他嘛?
Input
多组测试数据。每组测试数据包含两个整数D(D<=30),n(n<=2^D-1)。
Output
对于每组测试数据输出一个整数,代表最后一个小球最终下落在哪个结点。
Sample Input
4 14 24 3
Sample Output
8
12
10
球先到节点上 然后开关状态再改变 (不是所以的开关状态改变,只是当前到的开关状态改变)
奇数球往左 偶数球往右
#include<bits/stdc++.h> using namespace std; /* 1-2-4>8 1-3-6>12 1-2-5>10 1-3-7>14 */ int main() { int d,n; while(scanf("%d%d",&d,&n)!=EOF) { int k=1,i; for(i=0;i<d-1;i++) { //奇数个,向左子树移动,偶数个,向右字树 if(n%2!=0) { k=k*2;//左k=k*2 n=(n+1)/2; } else { k=k*2+1;//右k=k*2+1 n=n/2; } } printf("%d\n",k); } return 0; }