一个等差数列
一定是这样的(不考虑d = 0的情况)
a a+d a+2d a+3d ...... a+kd
每一项与第一项的差一定是d的倍数
而项数 = (a末 - a首) / d + 1
想要项数最小,那么a末一定是给出的数的最大值,a首一定是给出的数的最小值,d是每一项和第一项差的最大公约数
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
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++) cin >> a[i];
sort(a,a + n);
int d = 0;
for(int i = 1;i < n;i++) d = __gcd(d,a[i] - a[0]);//每一项和第一项的差,d为每一项和第一项的差的最大公约数
if(d == 0)
{
cout << n << endl;
}
else
{
cout << (a[n - 1] - a[0]) / d + 1 << endl;
}
return 0;
}