等差数列
题目
数学老师给小明出了一道等差数列求和的题目。
但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数。
现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?
输入格式
输入的第一行包含一个整数 N。
第二行包含 N 个整数 A1,A2,⋅⋅⋅,AN。(注意 A1∼AN 并不一定是按等差数
列中的顺序给出)
输出格式
输出一个整数表示答案。
数据范围
2 ≤ N ≤ 100000 0 ≤ A i ≤ 1 0 9 2≤N≤100000 \\ 0≤Ai≤10^9 2≤N≤1000000≤Ai≤109
输入样例
5
2 6 4 10 20
输出样例
10
题解
思路
- 首先进行排序
- 其次选取所有相邻两数之差的最大公因数作为公差
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 20, MAX = 0x3f3f3f3f;
int n, a[N];
int get(int x, int y) {
return x ? get(y % x, x) : y;
}
int main () {
cin >> n;
int minv = MAX, maxv = -MAX;
for (int i = 0; i < n; i ++) cin >> a[i];
sort(a, a + n);
int minl = -1;
for (int i = 0; i + 1 < n; i ++)
if (minl == -1)
minl = a[i+1] - a[i];
else
minl = get(min(minl, a[i+1]-a[i]), max(minl, a[i+1]-a[i]));
if (minl == 0) cout << n;
else cout << (a[n-1] - a[0]) / minl + 1;
return 0;
}