第十届蓝桥杯B组 1246. 等差数列 知识点:gcd

150 阅读1分钟

1246. 等差数列 - AcWing题库

解析:阿里云盘 (aliyundrive.com)

这道题让我们求等差数列的最小项数。

根据题目样例及其样例 解释 我 们发现要先对给定的等差数列排个: 序: image.png

等差数列的项数=ana1/d+1等差数列的项数 = (an-a1)/d+1

因为求最小,所以分母越小,分母越大,那么求出来的项数就越小。

分子: an越大,a1越小,an-a1就越小 。因为首尾项已经是定值,所以我们只能通过改变分母使结果最小

分母: 分母为最大公约数时分母最大

因为 等差数列可以表示为如下:

a1+(a1+d)+(a1+2d)+(a1+3d)+(a1+4d)+(an+(n1)d)a1+(a1+d)+(a1+2d)+(a1+3d)+(a1+4d)+(an+(n-1)*d)

观察式子我们发现每一项都是a1的xd倍,每一项 减 第一项都能得到一个 xd ,我们把,每一项 减 第一项 得到的公差 xd放到一起求出一个最大公约数,作为分母。

#include<bits/stdc++.h>
using namespace std;
int a[100010];
int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}
int main()
{
    int n;cin>>n;
    
    for(int i=0;i<n;i++)
    {
        cin>>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);  //d为0,说明等差数列的所有值都一样
    else printf("%d\n",(a[n-1]-a[0])/d+1);
    return 0;
}