1. 程式人生 > 實用技巧 >Codeforces Round #665 (Div. 2) C. Mere Array 數論,思維

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");
}