前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >1466: [蓝桥杯2019初赛]等差数列

1466: [蓝桥杯2019初赛]等差数列

作者头像
可爱见见
发布2020-02-26 12:27:34
7700
发布2020-02-26 12:27:34
举报
文章被收录于专栏:卡尼慕卡尼慕

题目

数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N 个整数。现在给出这N 个整数,小明想知道包含这N 个整数的最短的等差数列有几项?

思路

这个题目总体难度不大,考的是思路。

需要求出包含N个整数的最短等差数列,根据公式 (an - a1) / d + 1 = n,知道要想数列最短,则需要最大的公差d,于是问题转换为求出最大公差d。

公差d一定可以整除数列中每一个数ai减第一个数a1,即:(ai-a1)%d = 0,因此,公差d最大为(ai-a1)的最大公因数!于是,问题又转换到熟悉的gcd上了。

这里还需要特别注意d = 0的情况!

代码

代码语言:javascript
复制
#include <iostream>
#include <algorithm>

using namespace std;
const int maxn = 100010;
int n,a[maxn];

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];
    sort(a + 1, a + 1 + n);
    for(int i = 2; i <= n; i++)
        a[i] -= a[1];
    int d = a[2];
    for(int i = 3; i <= n; i++)
        d = gcd(d, a[i]);
    if(d)
        cout<<a[n] / d + 1<<endl;
    else
        cout<<n<<endl;
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 卡尼慕 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档