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
\]
代码只需用矩阵优化一下递推即可,略。