這題需要費式數列的一般遞推式 F(n) = F(n-1) + F(n-2)
以及一些式子的變形,舉例如下
例如求 GCD ( F(20) , F(30) )
首先我們知道 F(30) = 1 * F(29) + 1 * F(28)
= 2 * F(28) + 1 * F(27)
= 3 * F(27) + 2 * F(26)
= 5 * F(26) + 3 * F(25)
( 連續對比較大的項依遞推式拆成兩個較小的項 )
其中觀察到係數,也各自成費式數列 ( 直的看 )
所以可以改寫成 F(30) = F(2) * F(29) + F(1) * F(28)
= F(3) * F(28) + F(2) * F(27)
= F(4) * F(27) + F(3) * F(26)
= F(5) * F(26) + F(4) * F(25)
............................................................................
= F(11) * F(20) + F(10) * F(19)
注意到我刻意將比較大的項變成 F(20),就是上面範例要求的
此時,因為 F(20) 可以整除自己,並且 F(20) 與 F(19) 互質 ( 下一篇會證明 )
所以 GCD ( F(20) , F(30) ) = GCD ( F(20) , F(11) * F(20) + F(10) * F(19) )
= GCD ( F(20) , F(10) )
原問題就變成求 GCD ( F(20) , F(10) ) 了,以下繼續
F(20) = F(2) * F(19) + F(1) * F(18)
= F(3) * F(18) + F(2) * F(17)
= F(4) * F(17) + F(3) * F(16)
= F(5) * F(16) + F(4) * F(15)
.......................................................
= F(11) * F(10) + F(10) * F(9) 兩項都含有 F(10)
所以 GCD ( F(20) , F(10) ) = GCD ( F(11) * F(10) + F(10) * F(9) , F(10) ) = F(10)
故原問題 GCD ( F(20) , F(30) ) = F(10)
由上面的推導與觀察可知,若要求 GCD ( F(m) , F(n) ),可以先求 GCD ( m , n ) ,假設 GCD ( m , n ) = k
則 GCD ( F(m) , F(n) ) = F(k),即為答案
因為題目保證答案在 unsigned long long 內,因此 F(k) 中的 k = 93 時,為還沒產生溢位下所能表示的最大值
只要建表,求 GCD ( m , n ) = k,然後查表即可求解