You are given an array a1,a2,…,ana1,a2,…,an where all aiai are integers and greater than 00.
In one operation, you can choose two different indices ii and jj (1≤i,j≤n1≤i,j≤n). If gcd(ai,aj)gcd(ai,aj) is equal to the minimum element of the whole array aa, you can swap aiai and ajaj. gcd(x,y)gcd(x,y) denotes the greatest common divisor (GCD) of integers xx and yy.
Now you'd like to make aa non-decreasing using the operation any number of times (possibly zero). Determine if you can do this.
An array aa is non-decreasing if and only if a1≤a2≤…≤ana1≤a2≤…≤an.
Input
The first line contains one integer tt (1≤t≤1041≤t≤104) — the number of test cases.
The first line of each test case contains one integer nn (1≤n≤1051≤n≤105) — the length of array aa.
The second line of each test case contains nn positive integers a1,a2,…ana1,a2,…an (1≤ai≤1091≤ai≤109) — the array itself.
It is guaranteed that the sum of nn over all test cases doesn't exceed 105105.
Output
For each test case, output "YES" if it is possible to make the array aa non-decreasing using the described operation, or "NO" if it is impossible to do so.
Example
input
Copy
4
1
8
6
4 3 6 6 2 9
4
4 5 6 7
5
7 5 2 2 4
output
Copy
YES
YES
YES
NO
Note
In the first and third sample, the array is already non-decreasing.
In the second sample, we can swap a1a1 and a3a3 first, and swap a1a1 and a5a5 second to make the array non-decreasing.
In the forth sample, we cannot the array non-decreasing using the operation.
https://codeforces.com/contest/1401/problem/C
题解:刚开始考虑计算两两的gcd,但是数据规模较大会TLE。细想发现min的倍数都可以任意交换,因为min和它的任意倍数gcd
都是自己,将min作为跳板可以使它的倍数任意交换。容易想到将满足交换条件的数进行排序,最后验证是否升序。但是n^2排序会TLE,快排不好实现。换一个方式,将数组排序后,与原数组比对,如果该位置的数不能交换且顺序错误,即不能满足条件
代码:
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=100000;
int a[maxn+1],b[maxn+1];
int main()
{
int m;
cin>>m;
for (int i=1;i<=m;i++)
{
int n;
cin>>n;
int mini=1000000000;
for (int j=1;j<=n;j++)
{
cin>>a[j];
mini=min(a[j],mini);
b[j]=a[j];
}
sort(b+1,b+n+1);
bool flag=true;
for (int j=1;j<=n;j++)
{
if ((a[j]!=b[j])&&(a[j]%mini!=0))
{
cout<<"NO"<<endl;
flag=false;
break;
}
}
if (flag) cout<<"YES"<<endl;
}
}