漢諾塔(一)
時間限制:1000 ms | 內存限制:65535 KB
難度:3
描述
在印度,有這麼一個古老的傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裏,一塊黃銅板上插着三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和衆生也都將同歸於盡。
現在請你計算出起始有m個金片的漢諾塔金片全部移動到另外一個針上時需要移動的最少步數是多少?(由於結果太大,現在只要求你算出結果的十進制位最後六位)
輸入
第一行是一個整數N表示測試數據的組數(0<N<20)
每組測試數據的第一行是一個整數m,表示起始時金片的個數。(0<m<1000000000)
輸出
輸出把金片起始針上全部移動到另外一個針上需要移動的最少步數的十進制表示的最後六位。
樣例輸入
2
1
1000
樣例輸出
1
69375
來源
解題思路:
羅漢塔定理f(x)=f(x-1)*2+1,化簡之後我們發現就是快速冪。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
long long PowerMod(long long a, long long b, long long c)
{
long long ans = 1;
a = a % c;
while(b>0)
{
if(b % 2 == 1)
ans = (ans * a) % c;
b = b/2;
a = (a * a) % c;
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
long long n;
while(t--)
{
scanf("%lld",&n);
long long cc=2;
long long dd=1000000;
long long ans=PowerMod(cc,n,dd)-1;
printf("%lld\n",ans);
}
return 0;
}
---------------------