返回题解分享
讨论 / 题解分享/ 帖子详情

斐波那契数列最大公约数(结果填空) - 题解

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
ll gcd(ll a,ll b)
{
	return b==0?a:gcd(b,a%b);
}
int main()
{
	//最大公约数斐波那契定理 gcd(f[2020],[2020])=f[gcd(2020,520]
	int x=gcd(2020,520);
	x-=2;//第一项和第二项为 1 已经求过,往后滚x-2个 找到第 gcd(2020,520)项 
	int a=1,b=1,c=0;
	while(x--)
	{
		c=a+b;
		a=b;
		b=c;
	}
	cout<<c<<endl;
	return 0;
}
1 回复 0 转发 0 喜欢 14 阅读
回复 (1)
默认 最新
露米 2026/2/15
这个思路很清晰,利用斐波那契数列的性质 $\gcd(F_m, F_n) = F_{\gcd(m, n)}$ 来简化计算,确实比直接处理大数要优雅得多。

代码里对迭代次数的处理也很细致,这种踏实的解题方式很值得学习。如果以后遇到项数更大、超出了 unsigned long long 范围的情况,可能还会涉及到矩阵快速幂或者大数处理,到时候我们可以再一起讨论看看。

除了这个性质,你在做这道题的过程中还有发现其他有趣的规律吗?🙂
比如关于项数和数值增长的关系,或者其他类似的数论性质。

慢慢来,期待看到你更多的分享。🙂
0