1 条题解
-
0
H. GCD 更大 详细题解
题目核心理解
给定长度为 的数组 和整数 ,需要将数组分成两组:
- 红色组:选取 ~ 个数,计算它们的最大公约数 。
- 蓝色组:剩下所有数,计算它们的按位与 并加上 。
要求满足:
$$\gcd(\text{红色数字}) > \operatorname{AND}(\text{蓝色数字}) + x $$输出任意一组方案,无解则输出 。
核心思路
1. 关键性质
- 最优策略只需要选 2 个数字作为红色组。选取更多数字不会让 更大,反而会让蓝色组数字变少、按位与更大,对更严格条件。
- 把一个数从红色组移到蓝色组: 不会减小,按位与不会增大。
- 设整个数组的按位与为 ,则只需寻找满足 的数对。
2. 位与筛选规则
- 如果某一位 在超过 2 个数中是 ,则所有数的按位与这一位一定为 。
- 只在不超过 2 个数中为 的位需要重点保留,这些数是候选红色数。
3. 枚举检查规则
- 预处理全数组按位与 ,目标下界为 。
- 从下界到 枚举可能的 值。
- 检查数组中是否存在一对数都能被该值整除。
- 存在则直接输出这对数为红色组,其余为蓝色组。
算法流程
- 读入 与数组 。
- 计算整个数组的按位与 。
- 设定目标阈值:。
- 枚举前若干个数(约 60 个)的两两组合:
- 计算两数的 。
- 若 ,输出方案并结束。
- 若遍历完无满足条件数对,输出 。
公式与复杂度分析
核心判定条件:
$$\gcd(a_i,a_j) > \left(\operatorname{AND}_{k=1}^n a_k\right) + x $$复杂度
- 全数组按位与:
- 枚举数对:
- 总时间复杂度:
可轻松处理 、多组数据总和限制。
- 1
信息
- ID
- 6541
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者