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

题目描述 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N 个整数。 现在给出这N个整数,小明想知道包含这N 个整数的最短的等差数列有几项? 输入 输入的第一行包含一个整数N。 第二行包含N 个整数A1.A2,…,AN。(注意A1<=AN 并不一定是按等差数列中的顺序给出) 2<=N<=100000,0<=Ai<=10^9 输出一个整数表示答案。
样例输入
5 2 6 4 10 20
样例输出
10
提示 包含2、6、4、10、20的最短的等差数列是2、4、6、8、10、12、14、16、18、20。

思路:排序,求差的gcd
注意边界 如 2 2 2 型的数列要特判

#include
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;

int n;
int a[100005];

int gcd(int x,int y)
{
    if(x < y)
    {
        x = x + y;
        y = x - y;
        x = x - y;
    }
    if(y == 0)
    {
        return x;
    }
    else
    {
        return gcd(y,x%y);
    }
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

    cin >> n;
    int ma = -1,mi = 1e9+4;
    bool f = true;
    for(int i = 0; i < n; ++i)
    {
        cin >> a[i];
        ma = max(ma,a[i]);
        mi = min(mi,a[i]);
        if(i > 0 && a[i]!=a[i-1])
        {
            f = false;
        }
    }
    if(f)
    {
        cout << n;
        return 0;
    }
    sort(a,a+n);
    for(int i = n-1; i >0; --i)
    {
        a[i] = a[i] - a[i-1];
    }
    int t = a[1];
    for(int i = 1; i <= n - 1; ++i)
    {
        if(i == 0)
        {
            t = gcd(a[i],a[i+1]);
        }
        else
        {
            t = gcd(t,a[i+1]);
        }
    }
    cout << (ma-mi+t)/t;
	return 0;
}

你可能感兴趣的:(算法)