1466: [蓝桥杯2019初赛]等差数列
时间限制: 1 Sec 内存限制: 256 MB
提交: 750 解决: 146
[状态] [提交] [命题人:外部导入]
题目描述
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N 个整数。
现在给出这N 个整数,小明想知道包含这N 个整数的最短的等差数列有几项?
输入
输入的第一行包含一个整数N。
第二行包含N 个整数A1.A2,..., AN。(注意A1<=AN 并不一定是按等差数列中的顺序给出)
2<=N<=100000,0<=Ai<=10^9
输出
输出一个整数表示答案。
样例输入 Copy
5
2 6 4 10 20
样例输出 Copy
10
提示
包含2、6、4、10、20 的最短的等差数列是2、4、6、8、10、12、14、16、18、20。
这一题不算难题,所以我先给出代码,然后再给出我的分析
下面是代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int a[N];
int gcd(int a, int b)//函数,求两数的最大公因数
{
return b ? gcd(b, a % b) : a;
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);//读入数据
sort(a, a + n);//将数据进行排序,(因为,我们操作的是等差数列,而它正是单调的
int d = 0;//当d=0,经过gcd函数得到的是和他一起的另一个数
for (int i = 1; i < n; i ++ ) d = gcd(d, a[i] - a[0]);
if (!d) printf("%d\n", n);//如果是常数列,则直接输出n就好了
else printf("%d\n", (a[n - 1] - a[0]) / d + 1);
return 0;
}
这一题让我们求出这个数列作为一个等差数列最短有几项
说白了,就是要我们找到最大项、最小项和最大的公差。
为什么呢,用下面的图来说一下我们所利用的公式
下面说明这个公式该怎么用