1 条题解
-
0
题目大意
给定 个正整数 ,求有多少个有序数对 满足:
- ,
- 是 的倍数(即 )
样例分析
样例 1
输入: 6 16 11 6 1 9 11 输出: 7解释:
- : 是 的倍数
- : 是 的倍数
- : 是 的倍数
- : 是 的倍数
- : 是 的倍数
- : 是 的倍数
- : 是 的倍数
共 个有效数对。
算法思路
暴力解法(40分)
直接枚举所有 的数对,检查 是否是 的倍数。
- 时间复杂度:
- 空间复杂度:
优化解法(100分)
核心思想
使用频次统计和倍数枚举来优化:
- 频次统计:用数组 记录数值 在序列中出现的次数
- 倍数枚举:对于每个数 ,枚举它的所有倍数 ,统计这些倍数在序列中出现的总次数
- 答案计算:对于 ,它能作为倍数的数对数量为所有 出现次数之和减 (减去自身)
算法步骤
- 读入数据,找到最大值
- 统计每个数值的出现频次
- 对于每个 :
- 枚举所有倍数:$a_i, 2a_i, 3a_i, \ldots, \lfloor \frac{\text{max}_a}{a_i} \rfloor \times a_i$
- 累加这些倍数出现的次数
- 答案增加 (减去自身)
时间复杂度
- 频次统计:
- 倍数枚举:对于每个 ,需要枚举 次
- 总复杂度:$O(n + \sum\limits_{i=1}^n \frac{\text{max}_a}{a_i})$
- 最坏情况下约为 ,可以接受
空间复杂度
- ,用于存储频次数组
关键点说明
1. 去重处理
在统计每个 的倍数时,需要减去自身出现的次数,因为题目要求 。
2. 数值范围
- 频次数组大小:
3. 边界情况
- 当 时,需要枚举所有数,但频次统计保证了效率
- 重复数值需要正确计数
算法优势
- 避免重复计算:通过频次统计,相同数值只需计算一次倍数关系
- 利用数值范围: 有限,倍数枚举在可控范围内
- 简单高效:代码实现简洁,易于理解和调试
算法标签
- 数学
- 计数
- 倍数枚举
- 频次统计
总结
本题通过将问题转化为频次统计和倍数枚举,巧妙地避免了 的暴力枚举,在给定的数据范围内能够高效求解。核心在于发现数值范围的有限性,从而使用空间换时间的策略。
- 1
信息
- ID
- 4184
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者