原题链接:Problem - C - Codeforces
题意: 给定一个长度为n的数组,请问是否存在一个数 x ,使得任意两个数
与
满足
。若是输出 YES ,反之输出 NO 。
思路: 我们可以发现一个规律:
规律:若 并且
,那么
中的
不可以等于
。因为若
等于
,
和
就会被
整除,这样子
就不为1了,就不符合题意了。
好了,现在我们提炼一下上面的规律:若数组中有两个数模 余
,那么
就不可以等于
。我们可以进一步得出以下条件:
条件:因为 ,所以若
都不能选了,那么
就没值可以选了(此时若
,选
和
是一样的效果,所以
都不能选),因此若要符合题目要求,则
中至少要有一个能选,也就是
中至少有一个余数
是小于两个的。
最后,我们可以得出 都必须满足上述的条件,但是又因为
时,区间大小大于
,
个物品放入空间大于
的格子,怎么放都会有一个格子里的物品数小于2(鸽巢原理),所以只需要枚举
即可,最后的最后别忘了判断数组内有数字重复的情况。
void solve() {
set<int> s;
int n;
cin >> n;
FOR(1, n) {
cin >> a[i];
s.insert(a[i]);
}
if (s.size() != n) {
no;
return;
}
FOR(2, n / 2) {
mem(mp, 0);
FORj(1, n) mp[a[j] % i]++;
if (*min_element(mp, mp + i) >= 2) {
no;
return;
}
}
yes;
}