<蓝桥杯备考刷题>蓝桥杯15届省赛冲刺营结营考试:GCD王国和LCM王国(关于GCD和LCM的想法)

原题:GCD王国和LCM王国

当我拿到这个题目的时候 我没有多想(首先样例输出为什么是67??????麻烦严谨一点)就直接跳过了

但事实上这个题目如果你只要会GCD和LCM就一定能够写出来

gcd模板:

int gcd(int a,int b){
    return b?gcd(b,a%b):a;
}

这个就是求两个数的最大公因数!(底层用到的是辗转相除法,时间复杂度为logN);

lcm模板:

int lcm(int a,int b){
    return a*b/gcd(a,b);
}

最小公倍数很好理解 就是一个数学知识

那么来看这道题目:

暴力想法是 枚举所有数的lcm 再用gcd去做

这样时间复杂度必然爆(首先枚举两个数就一定会超时O(n^2))

那么我们一定要缩小时间复杂度到nlogn以下(基于是后面压轴题 我一开始的想法很复杂)

我就会用前缀+二分的思想

那么前缀怎么做呢?????或许lcm有类似于前缀的写法 使得到时候求一个区间只需要o(1)复杂度.....

好像又不是这么一回事 因为他并不是要我们求区间。。。而是两个数的差值 最后其实这是一个最简单的数学问题:真是服了。。。

直接上代码:

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N];
int n;
int gcd(int a,int b)//求两个数的最大公约数
{
  return b?gcd(b,a%b):a;
}
int main()
{
  cin>>n;
  for(int i=1;i<=n;i++) cin>>a[i];
  int t=a[1];
  for(int i=2;i<=n;i++)
  {
    t=gcd(t,a[i]);//求前i个数的最大公约数
  }
  cout<<t<<endl;
  return 0;
}

根本不需要最小公倍数。。。

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值