XYNUOJ1860: 漢諾塔(一)

1860: 漢諾塔(一)

時間限制: 1 Sec 內存限制: 64 MB
提交: 248 解決: 212
您該題的狀態:已完成
[提交][狀態][討論版]

題目描述

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

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

輸入

第一行是一個整數N表示測試數據的組數(0<N<20)
每組測試數據的第一行是一個整數m,表示起始時金片的個數。(0<m<1000000000)

輸出

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

樣例輸入

2
1
1000

樣例輸出

1
69375

#include<iostream> 
using namespace std;
int fast(long long a,long long b,long long c){
	long long result = 1;
	while(b>0){
		if(b%2==1)
		result = result*a%c;
		b /=2;
		a = a*a%c;
	}
	return result;
}
int main(){
	int n;
	long long m;
	cin>>n;
	while(n--){
		cin>>m;
		cout<<fast(2,m,1000000)-1<<endl;
	}
	return 0;
}

總結:

數學歸納發現2^n-1 ;由於數太大,常規寫法會爆掉。可以採用快速冪進行計算。
還有一個規律當m>100006時所得結果就是抹掉最高位的值。

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