1. 程式人生 > >HDU ACM1995——漢諾塔V

HDU ACM1995——漢諾塔V

漢諾塔V

Problem Description

用1,2,…,n表示n個盤子,稱為1號盤,2號盤,…。號數大盤子就大。經典的漢諾塔問 題經常作為一個遞迴的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔來源於 印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小 順序摞著64片黃金圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱 子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動一個圓盤。我們 知道最少需要移動2^64-1次.在移動過程中發現,有的圓盤移動次數多,有的少 。 告之盤 子總數和盤號,計算該盤子的移動次數.

Input

包含多組資料,首先輸入T,表示有T組資料.每個資料一行,是盤子的數目N(1<=N<=60)和盤 號k(1<=k<=N)。

Output

對於每組資料,輸出一個數,到達目標時k號盤需要的最少移動數。

Sample Input

2 60 1 3 1

Sample Output

576460752303423488 4 題解:這是一道很明顯的找規律的題目。顯而易見,n號盤子只用移動一次,而n-1號盤則需要移動2^1次,n-2號盤則需2 ^2次。以此類推,k號盤需2 ^(n-k+1)次。

#include<stdio.h>
int main()
{
	int T,N,k,i;
	long long int a,b,c;
	while(scanf("%d",&T)!=EOF){
		while(T--){
			scanf("%lld %lld",&a,&b);
			c=1;
			for(i=0;i<a-b;i++)
				c=c*2;
			printf("%lld\n",c);
		}
	}
	return 0;
 }