洛谷题解 P1306 斐波那契公约数 gcd&推式子&矩阵加速递推

· · 个人记录

题意

gcd(fib_n,fib_m)\bmod 1e8

思路

直接求肯定不行的,只能考虑推式子。

定理 1

gcd(fib_n,fib_{n+1})=1

证明:

施归纳法证明,假设已知 gcd(fib_{n-1},fib_n),则:

gcd(fib_{n-1},fib_n)=gcd(fib_{n-1}+fib_n,fib_n)=gcd(fib_{n+1},fib_{n})

对于 n=1 的情况,显然有 gcd(fib_{1},fib_2)=1

综上,gcd(fib_n,fib_{n+1})=1

定理 2

gcd(fib_n,fib_m)=gcd(fib_n,fib_{m-n})

证明:

默认 n\le m

由引理知:

gcd(fib_n,fib_m)=gcd(fib_n,fib_{m-n-1}*fib_{n}+fib_{m-n}*fib_{n+1})

注意到第二项的前半部分可表示为 fib_n 的乘积,那么还有:

gcd(fib_n,fib_m)=gcd(fib_n,fib_{m-n}*fib_{n+1})

由定理 1 知,gcd(fib_n,fib_{n+1})=1,所以:

gcd(fib_n,fib_{m-n})=gcd(fib_n,fib_{m-n}*fib_{n+1})

结合后两个式子,定理 2 得证。

定理 3

gcd(fib_n,fib_m)=fib_{gcd(n,m)}

证明

由定理 2 知:

gcd(fib_n,fib_m)=gcd(fib_n,fib_{m-n})

不断减下去就有:

gcd(fib_n,fib_m)=gcd(fib_n,fib_{m\bmod n})

这正是辗转相除法的递归式,最终我们能得到:

gcd(fib_n,fib_m)=gcd(0,fib_{k})=fib_k

显然 k=gcd(n,m),证毕。

实现

fib_{gcd(n,m)} 即可,矩阵加速递推可以解决此题。

提交记录