漢諾塔(一)
描述 在印度,有這麼乙個古老的傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。
現在請你計算出起始有m個金片的漢諾塔金片全部移動到另外乙個針上時需要移動的最少步數是多少?(由於結果太大,現在只要求你算出結果的十進位制位最後六位)
輸入
第一行是乙個整數n表示測試資料的組數(0輸出
輸出把金片起始針上全部移動到另外乙個針上需要移動的最少步數的十進位制表示的最後六位。
樣例輸入
211000
樣例輸出
169375
方法一:
對於漢諾塔求移動次數公式為f(n+1)=f(n)*2+1;
此題如果用要求十進位制最後六位,f(n+1)=(f(n)*2+1)%100000;
每次輸入層數,求出移動次數,但如果輸入資料很大,利用此公式必定超時,經過多次測試,發現若輸入資料大於100005,有如下規律,如:
f(123456)=f(23456); f(123456789)=f(23456789)---=f(56789)
即略去高位,
但 if(m%100000<6)則需進行此操作 m=100000+m%10;
這樣就不會超時了
**示例:
#includeint a[100010];
int main()
printf("%d\n",a[m]);
}return 0;
}
方法二:
快速模冪法
**示例1:
#includeint pm(long long m)
int main()
}
**示例2:
#includelong long pow_mod(long long n)
else
}int main()
return 0;
}
**示例3:
#includelong long pow_mod(long long n)
return s;
}int main()
return 0;
}
ps:我用的是方法二的**3,其他的都是大神寫的。。
NYOJ 漢諾塔(一)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述在印度,有這麼乙個古老的傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧...
NYOJ 題目88 漢諾塔(一)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在印度,有這麼乙個古老的傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個...
nyoj 88 漢諾塔(一)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在印度,有這麼乙個古老的傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個...