HDU 3117 Fibonacci Numbers(矩陣快速冪+公式)
題目地址:HDU 3117
對於後四位可以用矩陣快速冪快速求出來,但前四位就沒辦法了。要知道斐波那契數列是有通項公式的,所以只能通過通項公式來求前四位,但公式不能求後四位,因為公式使用浮點數求的,精度顯然不夠,求前四位要用到對數。
通項公式為:
f(n)=1/sqrt(5)(((1+sqrt(5))/2)^n+((1-sqrt(5))/2)^n)
假設F[n]可以表示成 t * 10^k(t是一個小數),那麼對於F[n]取對數log10,答案就為log10 t + K,此時很明顯log10 t<1,於是我們去除整數部分,就得到了log10 t ,
再用pow(10,log10 t)我們就還原回了t。將t×1000就得到了F[n]的前四位。 具體實現的時候Log10 F[n]約等於((1+sqrt(5))/2)^n/sqrt(5),這裡我們把((1-sqrt(5))/2)^n這一項忽略了,
因為當N>=40時,這個數已經小的可以忽略。於是log10 F[n]就可以化簡成log10 1/sqrt(5) + n*log10 (1+sqrt(5))/2。
於是就可以用矩陣快速冪求後四位,用公式求前四位。
代碼如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include