题解 P8682 [蓝桥杯 2019 省 B] 等差数列

思路

如果你随便试几个数,你就会发现这个等差数列的公差其实就是这个数列里从小到大两个数之差的最大公因数。

举个栗子: 3971153\quad9\quad7\quad1\quad15

对他进行排序 1379151\quad3\quad7\quad9\quad15

求相邻两数之差分别为 24262\quad4\quad2\quad6

计算易得最大公因数为 22

最后再用我们小学二年级就学过的等差数列项数公式

s=(ba)d+1s=\frac{(b-a)}{d}+1

其中 ss 为项数, aa 为首项, bb 为末项, dd 为公差

AC 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <bits/stdc++.h>
using namespace std;

int n,a[100005]={0},d,dt;

int gcd(int a,int b){
if(a==b) return a;
if(a>b) return gcd(a-b,b);
if(a<b) return gcd(b-a,a);
}

int main(){
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
}
sort(a+1,a+n+1);
d = a[2]-a[1];
for(int i=2;i<=n;i++){
dt = a[i]-a[i-1];
d = gcd(d,dt);
}
if(d==0) cout << n;
else cout << (a[n]-a[1])/d+1;
return 0;
}

AC 记录


题解 P8682 [蓝桥杯 2019 省 B] 等差数列
https://sunnyli.咕咕咕.eu.org/solution-P8682/
作者
SunnyLi
发布于
2023年4月22日
许可协议