蓝桥杯等差数列

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T2735

题目思维还是很不好想的,但是很经典

开始用普通的等差数列肯定是错了;

所以开始优化:

为了保证公差的正确性,应该是两两进行取最大公约数;

这样的意思是:2,4,8(假设公差是2)

但是中间还有6;

所以说这样就保证了这一运算的正确性。

具体情况代码已标注,这个题还是很值得重视的:

#include<bits/stdc++.h>
using namespace std;
int n;
int a[100010];
int d;//公差 
int ans;
int gcd(int a,int b)//gcd公约数函数 
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(register int i=1;i<=n;i++)
    cin>>a[i];
    sort(a+1,a+1+n);//先排序 
    for(register int i=2;i<=n;i++)
    {
        int temp=a[i]-a[i-1];//两两取最大公约数,这是因为2,4,8,但是按理说中间还有6,所以两两取公约数是为了保证公差d的正确性 
        d=gcd(d,temp);
    }
    if(d==0)//如果公差是0,那就只有n个 
    ans=n;
    else
    ans=(a[n]-a[1])/d+1;//等差数列公式 
    cout<<ans<<endl;
    return 0;
}

 

posted @ 2022-03-23 21:29  江上舟摇  阅读(28)  评论(0编辑  收藏  举报