AcWing_1246 等差数列(最大公约数、推公式)

AcWing

1246. 等差数列

假设:$a[0]$、$a[1]$、$\cdots$、$a[n-1]$是排序后的缺失等差数列,$d$是排序后的缺失等差数列中 每对相邻数的差值的 最大公约数,则:

$res=\frac{a[n-1] - a[0]}{d}+1$

最大公约数板子:

int gcd(int a, int b){  // a、b顺序任意
    return b ? gcd(b, a % b) : a;
}

代码:

#include <bits/stdc++.h>
using namespace std;
int n;
const int N = 100010;
int a[N];
int gcd(int a, int b){ return b ? gcd(b, a % b) : a; }
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin >> n;
    for(int i = 0; i <= n - 1; i ++) cin >> a[i];
    sort(a, a + n);
    int d = 0;
    for(int i = 1; i <= n - 1; i ++) d = gcd(d, a[i] - a[i - 1]);
    int res;
    if(d) res = (a[n - 1] - a[0]) / d + 1;
    else res = n;
    cout << res;
    return 0;
}