#18015: 觀察規律


freedom501999@gmail.com (帥氣魔方生)

學校 : 不指定學校
編號 : 88611
來源 : [39.8.203.54]
最後登入時間 :
2019-05-30 22:56:25
e272. gcd(Fm,Fn) -- π | From: [39.8.203.54] | 發表日期 : 2019-06-10 16:49

這題需要費式數列的一般遞推式 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,然後查表即可求解

 

 

 
ZeroJudge Forum