題目連結:
給定兩正整數 m 、 n (m 、 n ≦ 10, 000),求 Fm 與 Fn 的最大公因數。其中, Fm 、 Fn 分別代表費氏數列的第 m 項與第 n 項。且保證兩者的最大公因數必可以 unsinged long long 儲存(≦ 2 ^ 64 - 1)
假設給定的 m > n ,則我們可以得到:
Fm = Fm -1 + Fm -2
= 2 × Fm -2 + Fm -3
= 3 × Fm -3 + 2 × Fm -4
= …… = Fk × Fn+1 + Fk-1 × Fn ,其中 m - k = n 。
所求為 GCD(Fm , Fn) 即可簡化為 GCD(Fk × Fn+1 , Fn),因為 Fk-1 × Fn 必定是 Fn 的倍數,所以可以忽略。且 Fk × Fn+1 可進一步拆解為
Fk × Fn + Fk × Fn-1
所以 GCD(Fm , Fn) = GCD(Fk × Fn-1 , Fn),且相鄰兩項的費氏數列項次必定互質(Fn 與 Fn-1 互質)。因此:
GCD(Fm , Fn) = GCD(Fk, Fn)
而若 m < n ,則以上的 m 、 n 角色互換。
那要迭代到什麼樣子才停下呢?可以發現迭代到「新的」 m = n 、 m ≦ 2 或是 n ≦ 2 即可停止。(因為都可以立即獲得答案)。
當新的 m ≦ 2 或是 n ≦ 2 時,我們可以知道原本的 Fm 、 Fn 的最大公因數為 1 ,也就是兩者互質。
而當新的 m = n 時,則代表本來的 Fm 、 Fn 之最大公因數為 F新的 m ,而不會超過 unsigned long long 變數範圍( < 2 ^ 64)的最大費氏數列項次為 F93 。事先算出來
F1 ~ F93 即可馬上得出這邊的答案。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。