题目描述
我们都已经知道了汉诺塔问题,如果还有不懂得可以看以下解释:
汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三个金刚石柱子,在一根柱子上从上往下,按从小到大顺序摞着64片黄金圆盘,上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上,并且规定,在小圆盘上不能放大圆盘,在三根柱子之间每次只能移动一个圆盘,只能移动在最顶端的圆盘。
现在有 n 个圆盘从上往下,从小到大叠在第一根柱子上,要把这些圆盘全部移动到第三根柱子,我们都知道,最少的移动数目为 2^n - 1 次。但是现在我们要求的并不是这个。
我们用 1,2,...,n 表示 n个盘子的编号,编号越大盘子就越大。在移动过程中,有的圆盘移动次数多,有的少。告知盘子总数和盘号,计算该盘子的移动次数。
输入
输入包含多组数据,首先输入 T ,表示有 T 组数据。每个数据一行,是盘子的数目(1 <= N <= 60)和盘号 k (1 <= k <= N)。
输出
对于每组数据,输出一个数,即到达目标时 k 号盘需要的最少移动数。
样例输入
2 60 1 3 1
样例输出
576460752303423488 4
#include<stdio.h>
#include<string.h>
long long power(int n){
long long t=1;
int i;
for(i=1;i<=n;i++){
t*=2;
}
return t;
}
int main(){
int n,t,k;
while(scanf("%d",&t)!=EOF){
while(t--){
scanf("%d%d",&n,&k);
printf("%lld\n",power(n-k));
}
}
return 0;
}