本文最后更新于:16 分钟前
[蓝桥杯 2019 省 B] 等差数列
题目描述
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中 N个整数。
现在给出这 N个整数,小明想知道包含这个N整数的最短的等差数列有几项?
输入格式
输入的第一行包含一个整数 N。
第二行包含 N个整数 A1,A2,…An。(注意 A1~An 并不一定是按等差数列中的顺序给出 )。
输出格式
输出一个整数表示答案。
样例 #1
样例输入 #1
样例输出 #1
提示
包含 2,6,4,10,20
的最短的等差数列是 2,4,6,8,10,12,14,16,18,20
。
对于所有评测用例,2<=n<=1e5,0<=Ai<=1e9。
理解
先对数列按从小到大排序,再找等差数列的最大公约数。
代码
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 28 29 30
| #include <iostream> #include<cstdio> #include <sstream> #include<algorithm> #include<cmath> #include<string> using namespace std; int n; const int N=1e5+1e4; int arr[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++)scanf("%d",&arr[i]); sort(arr,arr+n); int d=0; for(int i=1;i<n;i++) { d=gcd(d,arr[i]-arr[i-1]); } if(!d)printf("%d",n); else cout<<(arr[n-1]-arr[0])/d+1<<endl; return 0; }
|