奇妙的塔

用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個盤子,則每個盤子移動的次數分別爲:

第k個盤子:              n              n-1          n-2          n-3         ......          2                  1

對應的移動次數:     1                2             4            8           ......       2^(n-2)          2^(n-1)

#include <stdio.h>
#define ll long long
int main()
{
    ll t;
    scanf("%lld",&t);
    while(t--)
    {
        ll n,k,m=1;
        scanf("%lld%lld",&n,&k);
        if(k==n)   printf("1\n");
        else
        {
            for(ll i=1;i<=n-k;i++)
                m=2*m;
            printf("%lld\n",m);
        }
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章