蓝桥集训之等差数列
-
核心思想:最大公约数
- 对于给定子序列 先从小到大排序
- 因为a[n-1]为最大一项 当a[n-1]为等差序列最后一项时 等差序列项数最少
- 因为a[0]为最大一项 当a[0]为等差序列第一项时 等差序列项数最少
- 且公差为所有a[i]-a[0]的最大公约数
-
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 100010; int a[N]; int n; int gcd(int a,int b) { return b?gcd(b,a%b):a; } int main() { cin>>n; for(int i=0;i<n;i++) scanf("%d", &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) cout<<n<<endl; //如果d为0 说明所有公差一样 本身就是等差 else cout<<(a[n-1]-a[0])/d +1<<endl; }