原题链接:
题目大意:
给定一个整数数组,每次操作可以选定一个整数x(x必须大于等于2),然后让数组所有数分别等于其模x的结果。问有没有可能在操作若干次(或者0次)之后使得整个数组相等。
解题思路:
如果这个数组是没有1的,
那么我们完全可以每次都mod数组中最大的那个数字,
这样就可以n次操作把所有数字都变为0。
如果这个数组有1,那我们就只能选择把所有的数字变为1,
设max为当前数组最大的数,我们每次都mod max-1即可。
但如果数组内有两个相邻的整数,则会使得操作后数组中出现0,
就没有办法达到目的
代码(CPP):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5 + 10;
const int INF = 0x3fffffff;
int n, a[maxn];
int main()
{
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cout << fixed;
cout.precision(18);
int t;
cin >> t;
while(t--)
{
cin >> n;
bool equal = true, has1 = false;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
if(i != 1 && a[i] != a[i - 1])
equal = false;
if(a[i] == 1)
has1 = true;
}
if(equal)
cout << "YES\n";
else if(!has1)
cout << "YES\n";
else
{
sort(a + 1, a + 1 + n);
bool flag = true;
for (int i = 1; i <= n; i++)
{
if(i != 1 && abs(a[i] - a[i - 1]) == 1)
flag = false;
}
cout << (flag ? "YES\n" : "NO\n");
}
}
return 0;
}