先去重排序,求相邻比例(辗转相除法),得到(q^a1,q^a2,q^a3……),再求以最小公比(q)为底时,幂(a1,a2,a3……)的最大公约数(辗转相减法:即将前面的相邻比例相除,得到幂的相减,q^a1 / q^a2 = q^(a1-a2))
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef struct{
long long u,d;
}fm;
vector<long long> v;
int n;
fm ans;
long long gcd(long long x,long long y){
if(x%y==0)
return y;
else
return gcd(y,x%y);
}
fm gcd2(fm x,fm y){
if(x.u==y.u && x.d==y.d)
return y;
else{
x.u=x.u/y.u;
x.d=x.d/y.d;
if(x.u*y.d>x.d*y.u)
return gcd2(x,y);
else
return gcd2(y,x);
}
}
int main() {
cin>>n;
for(int i=0;i<n;i++){
long long te;
int f=0;
cin>>te;
for(int j =0;j<v.size();j++)
if(v[j]==te)
f=1;
if(!f) v.push_back(te);
}
sort(v.begin(),v.end());
long long gg= gcd(v[1],v[0]);
ans.u=v[1]/gg;
ans.d=v[0]/gg;
for(int i=1;i<v.size()-1;i++){
long long g= gcd(v[i+1],v[i]);
fm f1;
f1.u=v[i+1]/g;
f1.d=v[i]/g;
if(ans.u*f1.d>ans.d*f1.u)
ans = gcd2(ans,f1);
else
ans = gcd2(f1,ans);
}
//for(int i=0;i<v.size();i++)
cout<<ans.u<<"/"<<ans.d;
return 0;
}