nyoj 88漢諾塔(一)(快速冪)

2021-07-04 01:34:43 字數 1550 閱讀 1111

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:3 描述

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

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

輸入

第一行是乙個整數n表示測試資料的組數(0輸出

輸出把金片起始針上全部移動到另外乙個針上需要移動的最少步數的十進位制表示的最後六位。

樣例輸入

2

11000

樣例輸出

1

先來看看漢諾塔滿足條件時需要的步數,

a[1]=1;

a[2]=3;

a[3]=7;

a[n]=2^n-1;

發現規律的具體方法對於大家來說應該不難,關鍵是這道題資料的處理,m最大為10000000000,直接求的話一定會超時,所以要有簡單的方法。

位運算,二分,對於實現這道題都不錯。前提都是快速冪。

裡面介紹了幾種面對這類問題的解答方法

這幾種**都是直接套用的裡面的模板

法一:#include

#include

#include

#include

#include

#include

using namespace std;

int pow3(int a,int b)   //位運算

return r%1000000;

} int main()

return 0;

} 法二:

#include

#include

#include

#include

#include

#include

using namespace std;

int pow2 (int a,int b)

return r;

} int main()

return 0;

} 法三:

#include

#include

#include

#include

#include

#include

using namespace std;

int pow4(long long  x,int n)

} long long result=x;

n>>=1;

while(n!=0)

return result;

} int main()

return 0;

}

nyoj 88 漢諾塔(一)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在印度,有這麼乙個古老的傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個...

NYOJ 88 漢諾塔(一)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在印度,有這麼乙個古老的傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個...

NYOJ 88 漢諾塔(一)

思路1 對於漢諾塔求移動次數公式為f n 1 f n 2 1 此題如果用要求十進位制最後六位,f n 1 f n 2 1 100000 每次輸入層數,求出移動次數,但如果輸入資料很大,利用此公式必定超時,經過多次測試,發現若輸入資料大於100005,有如下規律,如 f 123456 f 23456 ...