题目链接:codeforces 1401 C. Mere Array
题意:
给出一个数组,当只有 a[i] 和 a[j] 的最大公倍数 等于 数组中最小值的时候,两个数才可以交换。问最终能否交换成一个递增序列。
解题思路:
设最小元素为 m ,对于所有的 m 的倍数, m 可以与这些元素互换
而这些元素之间也可以借助 m 完成互换
所有对与不是 m 的倍数的数,看排个序后是否还是一样
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int a[maxn], b[maxn];
int main(){
int t;
scanf("%d", &t);
while(t--) {
int n, m = 1e9+1;
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
b[i] = a[i];
m = min(m, a[i]);
}
if(n == 1) {
printf("YES\n"); continue;
}
sort(a+1, a+1+n);
bool flag = true;
for(int i = 1; i <= n; i++) {
if(a[i] != b[i] && a[i] % m != 0) { // 如果相等,或者能通过m进行交换
flag = false;
break;
}
}
if(flag) {
printf("YES\n");
} else {
printf("NO\n");
}
}
return 0;
}