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

  • 2020 年 2 月 26 日
  • 笔记

题目

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

思路

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

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

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

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

代码

#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;  }