题目链接:https://vjudge.net/contest/436484#problem/C
这道题首先给出了一个数列,有一种操作的方法是,如果两个数的最大公因数等于这个数列中的最小数,那么两个数就可以交换位置,然后题目给出一个数列,问你可不可以通过操作将数列变为升序的数列。
首先我们将给出的数列进行升序排序,这样不仅可以确定最小值,也可以得到最终的升序数列,再将升序数列与原数列进行比较,将不同的项保留。最后在判断,每一个不同项是否是数列最小值得倍数。
代码如下:
using namespace std;
int a[100005],b[100005],c[100005];
int main()
{
int t;
cin>>t;
while(t--){
int n,cnt=0;
bool judge=true;
cin>>n;
for(int i=0;i<n;++i){
cin>>a[i];
b[i]=a[i];
}
sort(b,b+n);
for(int i=0;i<n;++i){
if(a[i]!=b[i]){
c[cnt++]=a[i];
}
}
for(int i=0;i<cnt;++i){
if(c[i]%b[0]!=0){
cout<<"NO"<<endl;
judge=false;
break;
}
}
if(judge)cout<<"YES"<<endl;
}
return 0;
}