Problem Description
n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列。由于
发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上,即各柱
子从下往上的大小仍保持如下关系 :
n=m+p+q
a1>a2>...>am
b1>b2>...>bp
c1>c2>...>cq
计算所有会产生的系列总数.
发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上,即各柱
子从下往上的大小仍保持如下关系 :
n=m+p+q
a1>a2>...>am
b1>b2>...>bp
c1>c2>...>cq
计算所有会产生的系列总数.
Input
包含多组数据,首先输入T,表示有T组数据.每个数据一行,是盘子的数
目N<30.
目N<30.
Output
对于每组数据,输出移动过程中所有会产生的系列总数。
Sample Input
3 1 3 29
Sample Output
3 2768630377364883
/*解析: 1.首先,k 号盘子的移动次数只与 k 下面的盘子数有关,而与 k 上面的盘子数无关, 具体原因自己想一下(有问题可以在下方留言),所以,原问题就可以转化为这样: 给定 k 个盘子,最上方的盘子移动了多少次。 2.找规律:假设最上方的盘子编号为 1 。 k==1,移动 1 次 ; k==2,1 移动 2次, 2 移动 1 次; k==3,1 移动 4 次; 2 移动 2 次; 3 移动 1 次; 由此,我们猜测在移动过程中,i 号盘子的移动次数是 i-1 号盘子的两倍(实际上这就是正确的); 则盘子数为 k ,1 号盘子的移动次数为 2^(k-1); 3.得出答案:ans=2^(n-k);*/ #include<stdio.h> #include<math.h> typedef long long ll; int main() { ll T,n,k,m; while(scanf("%lld",&T)!=EOF) { while(T--) { scanf("%lld%lld",&n,&k); ll x=pow(2,n-k); printf("%lld\n",x); } } return 0; }