数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数。
现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?
现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?
输入的第一行包含一个整数 N。
第二行包含 N 个整数 A₁, A₂, · · · , AN。(注意 A₁ ∼ AN 并不一定是按等差数列中的顺序给出)
第二行包含 N 个整数 A₁, A₂, · · · , AN。(注意 A₁ ∼ AN 并不一定是按等差数列中的顺序给出)
输出一个整数表示答案。
5
2 6 4 10 20
2 6 4 10 20
10
包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、 18、20。
思路:先排序,然后求出每相邻两个数的差值,然后求其最大公约数作为d,如果碰见0,直接判定为等差为0,输出n 代码
#include<bits/stdc++.h> using namespace std; long long a[100010]; int n; int ans,t; int gcd(int x,int y) { if(x==0||y==0) return 0; int t; do{ t=x%y; x=y; y=t; }while(y); return x; } int main() { int i,t,k,maxt,mint; cin>>n; cin>>a[1]; for(int i=2;i<=n;i++) { cin>>a[i]; } sort(a+1,a+n+1); maxt=a[n]; mint=a[1]; a[1]=a[2]-a[1]; t=a[1]; for(i=2;i<n;i++) { a[i]=a[i+1]-a[i]; t=gcd(t,a[i]); } if(t==0) k=n; else k=(maxt-mint)/t+1; cout<<k; return 0; }