分析:
等差数列项数=a末−a首d+1
要求最小项数,即让分子更小,分子更大
1.使分子更小->末项尽可能小,最小为当前的最大值;首项尽可能大,最大为当前的最小值
2.使分母更大->公差尽可能大,等差数列每一项与首项的差为kd
,不考虑某些记不清的项后,新构成的公差可能发生改变,要想使项数越少,即未考虑的项越少(需要添上的项越少),则公差需尽可能大,最大为gcd(n∑i=1kid)
【注】所有项均相等,即公差d=0时需要特判
(因为项数求和公式中d为分母),此时的最小项数即当前项数
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int gcd(int a,int b) { return b ? gcd(b,a % b) : a; }
int main()
{
int n;
scanf("%d",&n);
for(int i = 0;i < n;i ++) scanf("%d",&a[i]);
sort(a,a + n);
int d = 0; // 记录所有项与首项的差的最大公约数 即最大公差 初始化为首项与首项的差(0)
for(int i = 1;i < n ;i ++) d = gcd(d,a[i] - a[0]);
if(d == 0) cout << n <<endl;
else cout << (a[n - 1] - a[0]) / d + 1 << endl;
return 0;
}