1. 程式人生 > >NYoj88 漢諾塔(一)

NYoj88 漢諾塔(一)

漢諾塔(一)

時間限制:1000 ms  |  記憶體限制:65535 KB 難度:3
描述

在印度,有這麼一個古老的傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。

現在請你計算出起始有m個金片的漢諾塔金片全部移動到另外一個針上時需要移動的最少步數是多少?(由於結果太大,現在只要求你算出結果的十進位制位最後六位)

輸入
第一行是一個整數N表示測試資料的組數(0<N<20)
每組測試資料的第一行是一個整數m,表示起始時金片的個數。(0<m<1000000000)
輸出
輸出把金片起始針上全部移動到另外一個針上需要移動的最少步數的十進位制表示的最後六位。
樣例輸入
2
1
1000
樣例輸出
1
69375
解題思路:典型的快速冪。。。A^BmodC  

漢諾塔公式為 2^n - 1(n位金片數)

其中A = 2,B = m,C = 1000000.

#include <stdio.h>
#include <stdlib.h>
long long powMod(long long a,long long b,long long c)//快速冪
{
    long long result = 1;
    //a = a % c;
    while(b > 0)
    {
        if(b % 2 == 1)//當b為奇數時會多出一項,累計乘上
            result = result * a % c;
        b /= 2;//降冪
        a = a * a % c;//累計乘    例如:2^2 = 2*2 = 4 ,2^4 = 4 * 4 = 16, 2^6 = 16 * 16 ......而奇數上面已經考慮了       
    }
    return result;
}
int main()
{
    int n;
    long long m;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%lld",&m);
        printf("%lld\n",powMod(2,m,1000000)-1);
    }
    return 0;
}