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

















