洛谷题解 P1306 斐波那契公约数 gcd&推式子&矩阵加速递推
_Cheems
·
·
个人记录
题意
求 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)} 即可,矩阵加速递推可以解决此题。
提交记录