【蓝桥杯】斐波那契数列最大公约数

穿越隧道

前置知识

斐波那契数列最大公约数定理: g c d ( f [ n ] , f [ m ] ) = f [ g c d ( n , m ) ] gcd(f[n],f[m]) = f[gcd(n,m)] gcd(f[n],f[m])=f[gcd(n,m)]

起初:
打算将f[2020],和f[520]单独算出来,再对其求gcd.
然后,f[2020]和f[520]爆int和爆long long。

算斐波那契函数在第几项爆int,或者爆unsigned long long.

假设 c , a , b c,a,b c,a,b是斐波那契的连续三项,其中 c = a + b ( a ≥ 0 , b ≥ 0 ) , c a ≥ 1 c = a + b(a \geq 0 , b \geq 0), \frac{c}{a} \geq 1 c=a+b(a0,b0),ac1
当爆int或者ull时,则c为负数,则 c a < 1 \frac{c}{a} < 1 ac<1,。此时,可以根据这个性质来求,当分别到多少项时,爆int和ull

#include <iostream>
#include <cmath>
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N = 1e5 + 6;
ull ff[N];
int f[N];
int main()
{
  f[1] = 1;
  f[2] = 1;
  int ans = __gcd(2020,520);
  int i = 3;
  for(i = 3; (f[i - 1]/f[i-2]) >= 1; i++){
    f[i] = f[i-1] + f[i-2] ;
  }
  cout <<"boom: int = " << i << endl;
  int j = 3;
  ff[1] = 1;
  ff[2] = 1;
  for(j = 3; (ff[j - 1]/ff[j - 2]) >= 1; j++){
  	ff[j] = ff[j - 1] + ff[j - 2];
  } 
  cout << "boom: ull = " << j << endl;
	
  return 0;
}
//输出结果
boom: int = 48
boom: ull = 95
//当斐波那契类型为Int时,项数到48就爆了;ull同理

斐波那契数列最大公约数定理

该定理解决了爆ull的问题

#include <iostream>
#include <cmath>
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int N = 1e5 + 6;
ll f[N];
int main()
{
  f[1] = 1;
  f[2] = 1;
  int ans = __gcd(2020,520);
  for(int i = 3; i <= ans; i++){
    f[i] = f[i-1] + f[i-2] ;
  }
  cout << f[ans] << endl;

  return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值