Good Bye 2022: 2023 is NEAR C. Koxia and Number Theory

原题链接:Problem - C - Codeforces

题意: 给定一个长度为n的数组,请问是否存在一个数 x ,使得任意两个数 \small a[i]\small a[j]满足   

\small gcd(a[i]+x,a[j]+x)=1。若是输出 YES ,反之输出 NO 。

思路: 我们可以发现一个规律:

规律:若 \small a[i]%p1==p2 并且 \small a[j]%p1==p2 ,那么 \small a[i]+x 中的 \small x 不可以等于 \small p1-p2 。因为若 \small x 等于 \small p1-p2 , \small a[i] 和 \small a[j] 就会被 \small p1 整除,这样子   \small gcd(a[i],a[j])  就不为1了,就不符合题意了。

好了,现在我们提炼一下上面的规律:若数组中有两个数模 \small p1 余 \small p2 ,那么 \small x 就不可以等于  \small p1-p2 。我们可以进一步得出以下条件:

条件:因为 \small a[i]%p1\in[0,p1-1] ,所以若 \small [0,p2-1] 都不能选了,那么 \small x 就没值可以选了(此时若 \small x>=p2 ,选 \small x 和 \small x%p2 是一样的效果,所以 \small [0,p2-1] \small \cup \small [p2,+\infty ] 都不能选),因此若要符合题目要求,则 \small [0,p2-1] 中至少要有一个能选,也就是 \small a[i]%p1(1\leqslant i\leqslant n) 中至少有一个余数 \small \in[0,p1-1] 是小于两个的。

最后,我们可以得出 \small p1\in [2,+\infty ] 都必须满足上述的条件,但是又因为 \small p1> \frac{n}{2} 时,区间大小大于   \small \frac{n}{2} , \small n 个物品放入空间大于 \small \frac{n}{2} 的格子,怎么放都会有一个格子里的物品数小于2(鸽巢原理),所以只需要枚举 \small i\in [2,\frac{n}{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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值