NewOJ 1466: [蓝桥杯2019初赛]等差数列(思维)

题目链接:点击这里
在这里插入图片描述
在这里插入图片描述
上来先排个序。于是,对于该递增等差数列,首项 a 1 a_1 和 尾项 a n a_n 便固定了。

项数 = ( a n a 1 ) / d + 1 = (a_n-a_1) / d + 1 可知,公差 d d 越大,项数越小。

因此,问题就转变成了:求满足递增等差条件的最大公差 d d 是多少。

   (我的第一反应是二分,但捣鼓半天没捣鼓出来)

换个思路,满足条件的最大公差 d d 其实就是数列中所有相邻两项之差的最大公约数。

注意:

  1. 需要特判公差为 0 0 的情况
  2. g c d ( a , a ) = a gcd(a,a)=|a|
  3. g c d ( a , 0 ) = a gcd(a,0)=|a|
  4. g c d ( a , 1 ) = 1 gcd(a,1)=1
#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<map>
#include<set>

using namespace std;
typedef long long ll;
const int MOD = 10000007;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const int maxn = 100010;
int n, a[maxn], b[maxn];

int gcd(int a, int b)
{
	return b==0 ? a : gcd(b, a%b);
}

int main()
{
	scanf("%d", &n);
	for(int i = 1; i <= n; ++i)
		scanf("%d", &a[i]);
	
	sort(a+1, a+n+1);
	
	int cnt = 0;
	for(int i = 2; i <= n; ++i)
		b[++cnt] = a[i]-a[i-1];
	
	sort(b+1, b+cnt+1);
	
	if(b[1]==0)
	{
		printf("%d", n);
		return 0;
	}
	
	int d = b[1];
	for(int i = 2; i <= cnt; ++i)
		d = gcd(d, b[i]);
	
	printf("%d\n", ((a[n]-a[1])/d) + 1);
	
	return 0;
}
发布了748 篇原创文章 · 获赞 113 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/104497076
今日推荐