Make Equal With Mod-Codeforces

投稿日: 更新日:

問題リンク-Make Equal With Mod

問題

長さnnの非負整数列a1,a2,...,ana_1, a_2, ...,a_nが与えられます。以下の操作を0回以上行います。

x2x \geqq 2を満たす整数xxを選び1in1 \leqq i \leqq nを満たすaia_iaimodxa_i \mod xに置き換える。

操作終了後すべての要素を等しくできるか判定してください。

解法

数列に1の存在あり、なしで場合分けします。

1が存在しない場合

x=max(ai)x = \max(a_i)とします。操作をすれば、数列の最大値は0になります。これを繰り返すことですべての要素を0にすることが可能です。

したがって、1が存在しなければ常に答えはYESとなります。

1が存在する場合

x2x \geqq 2より1をこれ以上小さくすることは不可能です。よって、すべての要素を1にする必要があります。
x=max(ai)1x = \max(a_i)-1と置けば、数列の最大値は1にできます。しかし、数列中にmax(ai)1\max(a_i)-1が存在すればその値は0となりすべての要素を等しくすることが不可能となります。

したがって、aiaj1(1i,jn)|a_i - a_j| \neq 1 (1\leqq i,j \leqq n)であることが必要です。

実装

#include <bits/stdc++.h>
using namespace std;

string solve(){
    int n;
    cin >> n;
    vector<int> a(n);
    for(int& i : a)cin >> i;

    sort(a.begin(), a.end());

    bool exist1 = binary_search(a.begin(), a.end(), 1);
    if(!exist1){
        return "YES";
    }

    for(int i = 0;i < n-1; ++i){
        if(a[i+1] - a[i] == 1){
            return "NO";
        }
    }

    return "YES";
}

int main(){
    int t;
    cin >> t;
    while(t--){
        cout << solve() << endl;
    }
    return 0;
}

書いた人

profile_image

お茶の葉

物理とプログラミングが好きな人