问题描述
【题目描述】
【输入】
【输出】
【样例输入】
3
1250 200 32
4
3125 32 32 200
3
549755813888 524288 2
【样例输出】
25/4
5/2
4/1
题目解析
- 首先处理输入,对所有输入的整数排序加去重。
- 对两两相邻数求比值并用分数形式存储,可以存储到vector中。
- 对第一个比值开1~k次方,作为基数,如果该基数同样也是其他比值的基数的话,那么这个基数就是答案。
C++代码
#include<bits/stdc++.h>
using namespace std;
int N;
typedef long long LL;
LL data[100];
struct Ratio
{
LL x,y;
Ratio(LL _x,LL _y):x(_x),y(_y)
{
LL _gcd = gcd(x,y);
x/=_gcd;
y/=_gcd;
}
LL gcd(LL x,LL y)
{
if(y==0) return x;
return gcd(y,x%y);
}
};
vector<Ratio> ratios; //用于存储比值
map<LL,map<LL,LL> > all_ex; //all_ex[x][pow]表示x开pow次方
map<LL,map<LL,LL> > all_log; //all_log[x][y]表示y的多少次方是x
void init() //预处理
{
for(int i=2;i<1e6;i++) //底数
{
LL cur = (LL)i*i;
int pow = 2;
while(cur<1e12)
{
all_ex[cur][pow] = i;
all_log[cur][i] = pow;
pow++;
cur*=i;
}
}
}
LL extract(LL x,LL pow) //对x开pow次方
{
if(pow==1) return x;
if(x==1) return 1;
if(all_ex[x].find(pow)!=all_ex[x].end()) //意味着x可以开pow整数次方
return all_ex[x][pow];
else return -1;
}
LL log(LL base,LL x) //求log(base_x)
{
if(base==x) return 1;
if(all_log[x].find(base)!=all_log[x].end())
return all_log[x][base];
else return -1;
}
int main()
{
init();
scanf("%d",&N); //处理输入
for(int i=0;i<N;i++)
{
scanf("%lld",&data[i]);
}
sort(data,data+N); //排序
if(N==2)
{
Ratio ans = Ratio(data[1],data[0]);
cout<<ans.x<<"/"<<ans.y<<endl;
return 0;
}
for(int j=0;j<N-1;j++) //求两两比值并以分数形式存储进vector中
{
if(data[j+1]!=data[j]) //去重
ratios.push_back(Ratio(data[j+1],data[j]));
}
for(int pow=1;pow<=40;pow++) //对第一个比值开次方
{
Ratio ra0=ratios[0];
LL x = ra0.x;
LL y = ra0.y;
//开方处理
LL base_x = extract(x,pow); //对x开pow次方
LL base_y = extract(y,pow); //对y开pow次方
if(base_x==-1||base_y==-1) continue; //开不出来则continue
//能开的话就要去确认所有比值的分子是fx的整数次方
bool all_match = true;
for(int i=1;i<ratios.size();i++)
{
LL xx = ratios[i].x;
LL yy = ratios[i].y;
LL log_x = log(base_x,xx);
LL log_y = log(base_y,yy);
if(base_y==1&&yy==1) log_y=log_x;
if(log_x==-1||log_y==-1||log_x!=log_y)
{
all_match = false;
break; //进行下一次开方
}
}
if(all_match)
{
Ratio ans = Ratio(base_x,base_y);
cout<<ans.x<<"/"<<ans.y<<endl;
return 0;
}
}
return 0;
}