题目描述
You are given an array a1,a2,…,an where all ai are integers and greater than 0.
In one operation, you can choose two different indices i and j (1≤i,j≤n). If gcd(ai,aj) is equal to the minimum element of the whole array a, you can swap ai and aj. gcd(x,y) denotes the greatest common divisor (GCD) of integers x and y.
Now you’d like to make a non-decreasing using the operation any number of times (possibly zero). Determine if you can do this.
An array a is non-decreasing if and only if a1≤a2≤…≤an.
Input
The first line contains one integer t (1≤t≤104) — the number of test cases.
The first line of each test case contains one integer n (1≤n≤105) — the length of array a.
The second line of each test case contains n positive integers a1,a2,…an (1≤ai≤109) — the array itself.
It is guaranteed that the sum of n over all test cases doesn’t exceed 105.
Output
For each test case, output “YES” if it is possible to make the array a non-decreasing using the described operation, or “NO” if it is impossible to do so.
Example
input
4
1
8
6
4 3 6 6 2 9
4
4 5 6 7
5
7 5 2 2 4
output
YES
YES
YES
NO
Note
In the first and third sample, the array is already non-decreasing.
In the second sample, we can swap a1 and a3 first, and swap a1 and a5 second to make the array non-decreasing.
In the forth sample, we cannot the array non-decreasing using the operation.
题目大意
给你一个含有n个数的序列a[]。你可以进行如下操作:
如果gcd(a[i],a[j])=a[]中数的最小值,那么我们就可以交换a[i],a[j]的位置。
问如果只进行该操作,能否讲a[]变为一个不下降的序列。
题目分析
因为交换两个数的条件为:gcd(a[i],a[j])=a[]中的最小值,因此可以进行交换的数只有min(a[])的倍数,而非min(a[])的倍数的数都不能进行交换。
那么,我们可以将a[]与b[](排好序的a[])进行比较,如果某个位置上的a[i]不能被min(a[])整除且a[i]!=b[i],那么就无法通过该操作得到一个不下降的序列。及输出NO.
代码如下
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <queue>
#include <vector>
#include <set>
#include <algorithm>
#include <iomanip>
#define LL long long
#define PII pair<int,int>
using namespace std;
const int N=1e5+5;
int a[N],b[N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int k=1e9; //记录最小值
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i]; //b[]为排好序的a[]
k=min(k,a[i]);
}
sort(b+1,b+1+n);
bool flag=true;
for(int i=1;i<=n;i++)
{
if(a[i]==b[i]||a[i]%k==0) continue; //a[i]==b[i]或者a[i]能被k整除,则跳过
flag=false; //否则结果为NO
break;
}
if(flag) puts("YES");
else puts("NO");
}
return 0;
}