Codeforces Round #665 (Div. 2) C. Mere Array 数论,思维
Codeforces Round #665 (Div. 2) C. Mere Array
题意
给定数组\(a\) ,可以交换\(a_i , a_j\) 当且仅当$Min | (a_i,a_j) $ ,其中\(Min\) 为\(a\) 数组的最小值
问能否通过交换使得数组\(a\) 不降
分析
考虑需要交换的元素有哪些?
建立数组\(b\) ,对\(b\) 排序,如果$a_i \neq b_i $ ,说明\(a_i\) 是需要交换的。显然,若\(Min\) 不能整除这个\(a_i\) ,则\(a_i\) 永远没办法交换,直接\(return false\) 。否则,必然可以通过交换到相应的位置,如何交换?可以不断利用\(Min\) 作为跳板,具体证明略。
代码
ll a[maxn];
ll b[maxn];
bool solve() {
vector<ll> v;
int n = readint();
ll Min = 1e18;
for (int i = 0; i < n; i++) a[i] = readll(), b[i] = a[i], Min = min(Min, a[i]);
sort(b, b + n);
for (int i = 0; i < n; i++) {
if (a[i] != b[i]) {
if (a[i] % Min != 0) return false;
}
}
return true;
}
int main() {
int T = readint();
while (T--) if (solve()) puts("YES");
else puts("NO");
}