题意:min为数字序列arr的最小值,当两个数的最小公因数为min时可以交换位置,问经过数次操作后是否可以使得arr从小到大排列
两者的最小公因数为min的数可以交换,也就是说为min的倍数的数之间的位置可以随便交换,所以要使得arr升序排列,关键的是那些不能交换位置的数是否在它们该在的位置,所以我们只需要将原序列和升序排列的序列进行对比,如果存在一个数不为min的倍数且不再它原来的位置,这说明原序列无法通过交换操作得到升序序列。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<deque>
#include<map>
using namespace std;
typedef long long ll;
deque<int> dqmin, dqmax;
const int N = 1e5 + 100;
const int mod = 1e9;
int arr[N];
int vis[N];
map<int, int> mp;
int main() {
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--) {
int n, minm = 0x3f3f3f3f;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
vis[i] = arr[i];
if (arr[i] < minm) minm = arr[i];
}
sort(arr + 1, arr + 1 + n);
bool sign = true;
for (int i = 1; i <= n; i++) {
if (arr[i] % minm != 0 && arr[i] != vis[i]) {
sign = false;
break;
}
}
if (sign) cout << "YES" << endl;
else cout << "NO" << endl;
}
}