切換
舊版
前往
大廳
主題

ZeroJudge - e272: gcd(Fm,Fn) 解題心得

Not In My Back Yard | 2019-06-14 23:37:53 | 巴幣 0 | 人氣 707

題目連結:


題目大意:
給定兩正整數 m 、 n (m 、 n ≦ 10, 000),求 F 與 F 的最大公因數。其中, F 、 F 分別代表費氏數列的第 m 項與第 n 項。且保證兩者的最大公因數必可以 unsinged long long 儲存(≦ 2 ^ 64 - 1)



範例輸入:
1 2
3 6


範例輸出:
1
2


解題思維:
假設給定的 m > n ,則我們可以得到:
= Fm -1 + Fm -2
  = 2 × Fm -2 + Fm -3
  = 3 × Fm -3 + 2 × Fm -4
  = …… = F × Fn+1 + Fk-1 × F ,其中 m - k = n 。

所求為 GCD(F,  F) 即可簡化為 GCD(F × Fn+1 ,  F),因為 Fk-1 × F 必定是 F 的倍數,所以可以忽略。且 F × Fn+1 可進一步拆解為
× F + F × Fn-1
所以 GCD(F,  F) = GCD(F × Fn-1 ,  F),且相鄰兩項的費氏數列項次必定互質(F 與 Fn-1 互質)。因此:
GCD(F,  F) = GCD(F,  F


而若 m < n ,則以上的 m 、 n 角色互換。


那要迭代到什麼樣子才停下呢?可以發現迭代到「新的」 m = n 、 m ≦ 2 或是 n ≦ 2 即可停止。(因為都可以立即獲得答案)。

新的 m ≦ 2 或是 n ≦ 2 時,我們可以知道原本的 F 、 F 的最大公因數為 1 ,也就是兩者互質。

而當新的 m = n 時,則代表本來的 F 、 F 之最大公因數為 F新的 m ,而不會超過 unsigned long long 變數範圍( < 2 ^ 64)的最大費氏數列項次為 F93 。事先算出來 
~ F93 即可馬上得出這邊的答案。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作