本文主要是介绍[蓝桥杯 2019 省 B] 等差数列 |数学、最大公约数gcd、等差数列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:
P8682 [蓝桥杯 2019 省 B] 等差数列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
1.等差数列 - 蓝桥云课 (lanqiao.cn)
说明:
思路:
这道题首先想到的是先排序,因为等差数列是有一个大小顺序的。在这里按升序排,把数列看成非递减的,然后找出最小的差值,因为对于相差最小的这两个数,如果再把差值定大一点,这两个数就不能构成等差数列,再定小一点,要使这两个数构成等差数列就需要在中间插入数,就变长了,所以要尽在保持能够组成等差数列的同时可能少插入,所以以这两个数的差值做等差数列的差值,其他的两个数之间插入数来构成等差数列。
这样想好像没问题,但是:
如果最小差值为2d,某两项ai,ai+1差值为3d,那么就无法插入一个整数使得ai、插入的数、ai+1变成等差数列
于是就要找差值的最大公约数,因为只有公差为每个差值的约数才能在两个数之间插入自然数(从0开始的整数) 个 数字,使得序列变成等差数列。结合之前的要找大一点的数做公差,减少插入的数,使数列最短,那么就是找最大公约数了。
再用另一种说法来说明:对于等差数列有公式(an-a1) / d =n-1,d为公差。
因为要最短,不可能再添加比an更大的数或者比a1更小的数,那会使数列更长。所以(an-a1) 就确定了,于是当d越大,项数n越小。所以要保证序列为等差数列的同时,保证公差d最大。
因为该序列是等差数列的子序列。所以相邻两项的差一定是公差的倍数,即公差是所有相邻两项差的公约(因)数。我们的目标是公差d最大,那就求出序列所有相邻两项差的最大公因数, 最大公因数就是最大公差。
注意点:
1.1.C++库自带求最大公约数的函数,__gcd(a,b)。
2.公差为0的情况的特判
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
//先排序,按升序排,因为等差数列一定是非递减的,然后找出最小的差值,因为
//对于相差最小的这两个数,如果再把差值定大一点,这两个数就不能构成等差数列,
//再定小一点,要使这两个数构成等差数列就需要在中间插入数,就变长了,
//所以要尽在保持能够组成等差数列的同时可能少插入,所以以这两个数的差值做等差数列的差值,其他的两个数之间插入数
// 找差值的最大公约数
int n;
int ans=0;
int a[N];
signed main(){//关同步!!!ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n;for(int i=0;i<n;i++){cin>>a[i];}sort(a,a+n);int diff=__gcd(a[1]-a[0],a[2]-a[1]);for(int i=3;i<n;i++){diff=__gcd(a[i]-a[i-1],diff);}//等差数列 差值为0的情况if(diff==0) ans=n;elseans=(a[n-1]-a[0])/diff +1;cout<<ans;return 0;
}
这篇关于[蓝桥杯 2019 省 B] 等差数列 |数学、最大公约数gcd、等差数列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!