Luogu P1306 斐波那契数列公约数

斐波那契公约数

题目描述

对于 Fibonacci 数列:

\[ f_i = \begin{cases} [i = 1] & i \leq 1 \\ f_{i - 1} + f_{i - 2} & i \gt 1 \end{cases}\]

请求出 \(f_n\)\(f_m\) 的最大公约数,即 \(\gcd(f_n, f_m)\)

输入格式

一行两个正整数 \(n\)\(m\)

输出格式

输出一行一个整数,代表 \(f_n\)\(f_m\) 的最大公约数。答案请对 \(10^8\) 取模。

样例 #1

样例输入 #1

4 7

样例输出 #1

1

提示

数据规模与约定

  • 对于 \(100\%\) 的数据,保证 \(1 \leq n, m \leq 10^9\)

不妨令 n < m

\[f[n+2] = f[n] + f[n+1]; \]

\[f[n+3] = f[n+1] + f[n+2] = 2 * f[n+1] + f[n]; \]

\[f[n+4] = f[n+2] + f[n+3] = 2 * f[n+2] + f[n+1] = 3 * f[n+1] + 2 * f[n] \]

\[f[n+5] = 5 * f[n+1] + 3 * f[n] \]

发现如下规律

\[f[n+t] = f[t] * f[n+1] + f[t-1] * f[n] \]

将m代进去就有

\[f[m] = f[m-n] * f[n+1] + f[n-m-1] * f[n] \]

那么要求的就是\(Gcd(f[n] , f[m]) = Gcd(f[n] , f[m-n]*f[n+1] + f[n-m-1] * f[n])\)

然后由于\(f[n] \ \ | \ \ f[n-m-1] * f[n]\)

\(Gcd(f[n] , f[m]) = Gcd(f[n] , f[m-n]*f[n+1])\)

再因为\(Gcd(f[n] , f[n+1]) = 1\)

所以\(Gcd(f[n] , f[m]) = Gcd(f[n] , f[m-n])\)

发现n,m和求解\(Gcd(n,m)\)的辗转相除法一样,所以\(Gcd(f[n] , f[m]) = f[Gcd(n,m)]\)

关于\(Gcd(f[n] , f[n+1]) = 1\)的证明

\[Gcd(f[n] , f[n+1]) = Gcd(f[n] , f[n] + f[n-1]) \]

\[Gcd(f[n] , f[n+1]) = Gcd(f[n-1] , f[n]) \]

以此类推

\[Gcd(f[n] , f[n+1]) = Gcd(f[1] , f[2]) = 1 \]

代码只需用矩阵优化一下递推即可,略。

posted @ 2022-11-22 21:54  沙野博士  阅读(39)  评论(0)    收藏  举报