题目链接
:添加链接描述
(注:这里是多组测试用例,输入输出格式有一点区别)
解题思路
先排序(从小到大)
每一项ai都可写作a0*q^m的形式,各项相除便可得到最大比例(不一定是公比q,可能是q的n次幂)的若干次幂,且这些幂指数的最大公约数为1(可反证,若不为1,设其gcd=m,则存在更大的最大比例q的m次方),所以将这些项各项相除(用大的除以小的),用set去重,到最后只剩一项即为最大比例。
特判一下所有数相同,最大比例为1/1的情况。
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
ll c;
while(c = a%b){
a = b;
b = c;
}
return b;
}
struct fs{
ll fz,fm;
fs(){}
fs(ll f1,ll f2){
ll c = gcd(f1,f2);
fz = f1/c;
fm = f2/c;
}
bool operator<(const fs& f)const{
return fz*1.0/fm < f.fz*1.0/f.fm;
}
};
void robot(fs& f1,fs& f2){
f2.fz /= f1.fz;
f2.fm /= f1.fm;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n;
ll num;
set<ll> s;
vector<ll> v;
vector<fs> a;
for(int i = 0; i < n; ++i)
{
cin >> num;
s.insert(num);
}
if(s.size()==1)
{
cout << "1/1" << endl;
return 0;
}
v.assign(s.begin(),s.end());
sort(v.begin(),v.end());
set<fs> ss;
for(int j = 0; j < v.size()-1 ; ++j)
{
ss.insert(fs(v[j+1],v[j]));
}
a.assign(ss.begin(),ss.end());
sort(a.begin(),a.end());
if(a.size()==1)
{
cout << a[0].fz << "/" << a[0].fm << endl;
return 0;
}
sort(a.begin(),a.end());
while(true)
{
ss.clear();
for(int j = a.size()-1; j >= 1 ; --j)
{
robot(a[j-1],a[j]);
ss.insert(a[j]);
}
ss.insert(a[0]);
a.assign(ss.begin(),ss.end());
sort(a.begin(),a.end());
if(a.size() == 1 ){
cout << "ans: " << a[0].fz << "/" << a[0].fm << endl;
break;
}
}
return 0;
}