http://codeforces.com/contest/1165/problem/D
大意:
输入次数,对于每次,输入n,后跟n个数,求他们的最小公倍数,然后判断之前的n个数是不是它所有的乘数
思路:
1.最小公倍数就是最小乘最大(排序,ans=a[0]*a[n-1])
2.对剩余的a[2] to a[n-2],用ans和他们取模判断a[]是否为ans的乘数,如果出现不是乘数的,输出-1
3.求ans的乘数有几个,如果乘数个数不等于n,输出-1
避坑:注意int和 long long 的使用(惨痛的教训)
附源码
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
long long a[310];
int times,n;
cin>>times;
while(times--)
{
long long ans;
int flag=0;
cin>>n;
//in put
for(int i=0;i<n;i++)
{
cin>>a[i];
}
//get ans
sort(a,a+n);
ans=a[0]*a[n-1];
//check 1
for(int i=1;i<n-1;i++)
{
if(ans%a[i]!=0)
{
flag=1;
break;
}
}
//check2
int num=0;
long long lim=sqrt(ans);//!!!! long long !!!!
if(flag==0)
{
for(int i=2;i<=lim;i++)
{
if(ans%i==0)
{
num=num+2;
}
}
if(lim*lim==ans)
{
num--;
}
if(num!=n)
{
flag=1;
}
}
if(flag==1)cout<<"-1"<<endl;
else cout<<ans<<endl;
}
}