最大比例
题目
X星球的某个大奖赛设了 M 级奖励。
每个级别的奖金是一个正整数。
并且,相邻的两个级别间的比例是个固定值。
也就是说:所有级别的奖金数构成了一个等比数列。
比如:16,24,36,54,其等比值为:3/2。
现在,我们随机调查了一些获奖者的奖金数。
请你据此推算可能的最大的等比值。
输入格式
第一行为数字 N ,表示接下的一行包含 N 个正整数。
第二行 N 个正整数 Xi,用空格分开,每个整数表示调查到的某人的奖金数额。
输出格式
一个形如 A/B 的分数,要求 A、B 互质,表示可能的最大比例系数。
数据范围
0
<
N
<
100
0
<
X
i
<
1
0
12
0<N<100 \\ 0<Xi<10^{12}
0<N<1000<Xi<1012
数据保证一定有解。
输入样例
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;
}