这道题让我们求等差数列的最小项数。
根据题目样例及其样例
解释
我
们发现要先对给定的等差数列排个:
序:
解
因为求最小,所以分母越小,分母越大,那么求出来的项数就越小。
分子: an越大,a1越小,an-a1就越小 。因为首尾项已经是定值,所以我们只能通过改变分母使结果最小
分母: 分母为最大公约数时分母最大
因为 等差数列可以表示为如下:
观察式子我们发现每一项都是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;
}