原题链接: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;
}