[蓝桥杯][2019年第十届真题]等差数列

思路

要求包含这 N 个整数的最短的等差数列有几项,则首项取数组\(A\)中的最小值,末项取数组\(A\)中的最大值。

假设公差为\(d\),首相为\(A[0]\),则相邻两项的差\(A[i]-A[0],i \in [1,n-1]\)一定是公差\(d\)的倍数,于是对所有相邻两项的差求\(gcd\)即可得到公差\(d\)

const int N=1e5+10;
int a[N];
int n;

int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}

int main()
{
    cin>>n;

    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    sort(a,a+n);

    int d=0;
    for(int i=1;i<n;i++)
        d=gcd(d,a[i]-a[i-1]);

    if(d == 0) cout<<n<<endl;
    else cout<<(a[n-1]-a[0])/d+1<<endl;
    //system("pause");
    return 0;
}
posted @ 2021-04-03 13:37  Dazzling!  阅读(157)  评论(0编辑  收藏  举报