C++等差数列(数論、ユークリッド転々除去gcd)


数学の先生は明ちゃんに等差数列の和を求める問題を出した.しかし不注意な明ちゃんは一部の数列を忘れ、その中のN個の整数しか覚えていない.今このN個の整数を与えて、明ちゃんはこのN個の整数を含む最も短い等差数列がいくつあることを知りたいですか?入力フォーマット入力の最初の行には、整数Nが含まれます.2行目はN個の整数A 1,A 2,⋅⋅,ANを含む.(注意A 1〜ANは、必ずしも等差数列の順序で与えられるものではない)出力フォーマットは、整数表示の答えを出力する.データ範囲2≦N≦100000,0≦Ai≦109入力サンプル:5 2 6 4 10 20出力サンプル:10サンプル解釈2,6,4,10,20を含む最短の等差数列は2,4,6,8,10,12,14,16,18,20である.
列の長さを最短にするには、公差が最大で、公差が最大で第1項を除く各項と第1項の差の最大公約数をとることができます.
ACコード:
#include
#include

int n;
int a[100010];

int gcd(int a,int b)
{
     
    int d;
    if(a<b) std::swap(a,b);
    while(b)
    {
     
        d=a%b;
        a=b;
        b=d;
    }
    return a;
}

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

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

    if(!d) printf("%d",n);
    else printf("%d",(a[n-1]-a[0])/d+1);

    return 0;
}