[藍橋杯] 最大比例

最大比例

題目

X星球的某個大獎賽設了 M 級獎勵。

每個級別的獎金是一個正整數。

並且,相鄰的兩個級別間的比例是個固定值。

也就是說:所有級別的獎金數構成了一個等比數列。

比如:16,24,36,54,其等比值爲:3/2。

現在,我們隨機調查了一些獲獎者的獎金數。

請你據此推算可能的最大的等比值。

輸入格式

第一行爲數字 N ,表示接下的一行包含 N 個正整數。

第二行 N 個正整數 Xi,用空格分開,每個整數表示調查到的某人的獎金數額。

輸出格式

一個形如 A/B 的分數,要求 A、B 互質,表示可能的最大比例係數。

數據範圍

0<N<1000<Xi<10120<N<100 \\ 0<Xi<10^{12}
數據保證一定有解。

輸入樣例

3
1250 200 32

輸出樣例

25/4

題解

思路

  • 首先進行排序
  • 其次選取相鄰兩數之商的最大公因數作爲公比
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 105;
long long a[N], b[N], x[N], cnt, n;

long long gcd(long long a, long long b) {
    return b ? gcd(b, a % b) : a;
}

long long gcd_sub(long long a, long long b) {
    if (a < b) swap(a, b);
    if (b == 1) return a;
    return gcd_sub(b, a / b);
}

int main () {
    cin >> n;
    for (int i = 0; i < n; i ++) cin >> x[i];
    
    sort(x, x + n);
    
    for (int i = 1; i < n; i ++) 
        if (x[i] != x[i-1]) {
            long long t = gcd(x[0], x[i]);
            a[cnt] = x[i] / t;
            b[cnt] = x[0] / t;
            cnt ++;
        }
    
    long long  up = a[0], down = b[0];
    for (int i = 0; i < cnt; i ++) {
        up = gcd_sub(up, a[i]);
        down = gcd_sub(down, b[i]);
    }
    
    cout << up << "/" << down;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章