样例输入:
4 2
3 4
10 1
2 2
8 128
16 12345
样例输出:12
7
512
3
255
36358
1 //纯粹模拟算法 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 const int maxn = 20; 7 int s[1<<maxn]; //最大结点个数为2^maxn - 1 8 9 int main() 10 { 11 int D, I; 12 while(scanf("%d%d", &D, &I)==2) 13 { 14 memset(s, 0, sizeof(s)); //开关状态 15 int k, n = (1<<D) - 1; //n是最大结点编号 16 for(int i = 0; i<I; i++) //连续让I个小球下落。 17 { 18 k = 1; 19 for(;;) 20 { 21 s[k] = !s[k]; 22 k = s[k] ? k*2 : k*2 +1; // 根据开关状态选择下落方向。 23 if(k>n) break; //已经出界 24 } 25 } 26 printf("%d ", k/2); 27 } 28 return 0; 29 } 30
优化算法
1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 int D, I; 7 while(scanf("%d%d", &D, &I)==2) 8 { 9 int k = 1; 10 for(int i=0; i<D-1; i++) 11 if(I%2) 12 { 13 k=k*2; I = (I+1)/2; 14 } 15 else 16 { 17 k=k*2+1; I/=2; 18 } 19 printf("%d ", k); 20 } 21 return 0; 22 }