AcWing 1246. 等差数列
原题链接
中等
作者:
牛奶小柒Luke
,
2021-03-03 23:01:59
,
所有人可见
,
阅读 322
a a + d a + 2d ..... a + kd
每一项与第一项的差一定是d的倍数
len = (a[max] - a[min]) / d(所有d的最大公约数) + 1
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
int a[N];
int gcd(int a,int b){
return b ? gcd(b,a % b) : a;
}
int main(){
scanf("%d",&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[0]);
if(!d) printf("%d\n",n);
else{
LL len = (LL)(a[n - 1] - a[0]) / d + 1;
printf("%lld\n",len);
}
return 0;
}