1 条题解

  • 0
    @ 2025-10-26 16:45:37

    题目大意

    给定 nn 个正整数 a1,a2,,ana_1, a_2, \ldots, a_n,求有多少个有序数对 (i,j)(i, j) 满足:

    • 1in1 \le i \le n1jn1 \le j \le n
    • iji \ne j
    • aia_iaja_j 的倍数(即 ajaia_j \mid a_i

    样例分析

    样例 1

    输入:
    6
    16 11 6 1 9 11
    
    输出:
    7
    

    解释

    • (1,6)(1,6)161611 的倍数
    • (3,6)(3,6)6611 的倍数
    • (5,6)(5,6)9911 的倍数
    • (2,6)(2,6)111111 的倍数
    • (4,6)(4,6)111111 的倍数
    • (1,3)(1,3)161666 的倍数
    • (1,5)(1,5)161699 的倍数

    77 个有效数对。


    算法思路

    暴力解法(40分)

    直接枚举所有 iji \ne j 的数对,检查 aia_i 是否是 aja_j 的倍数。

    • 时间复杂度:O(n2)O(n^2)
    • 空间复杂度:O(n)O(n)

    优化解法(100分)

    核心思想

    使用频次统计倍数枚举来优化:

    1. 频次统计:用数组 freq[x]\text{freq}[x] 记录数值 xx 在序列中出现的次数
    2. 倍数枚举:对于每个数 aia_i,枚举它的所有倍数 k×aik \times a_i,统计这些倍数在序列中出现的总次数
    3. 答案计算:对于 aia_i,它能作为倍数的数对数量为所有 k×aik \times a_i 出现次数之和减 11(减去自身)

    算法步骤

    1. 读入数据,找到最大值 maxa\text{max}_a
    2. 统计每个数值的出现频次 freq[]\text{freq}[]
    3. 对于每个 aia_i
      • 枚举所有倍数:$a_i, 2a_i, 3a_i, \ldots, \lfloor \frac{\text{max}_a}{a_i} \rfloor \times a_i$
      • 累加这些倍数出现的次数 sum_valid\text{sum\_valid}
      • 答案增加 sum_valid1\text{sum\_valid} - 1(减去自身)

    时间复杂度

    • 频次统计:O(n)O(n)
    • 倍数枚举:对于每个 aia_i,需要枚举 maxaai\lfloor \frac{\text{max}_a}{a_i} \rfloor
    • 总复杂度:$O(n + \sum\limits_{i=1}^n \frac{\text{max}_a}{a_i})$
    • 最坏情况下约为 O(n+maxalogmaxa)O(n + \text{max}_a \log \text{max}_a),可以接受

    空间复杂度

    • O(maxa)O(\text{max}_a),用于存储频次数组

    关键点说明

    1. 去重处理

    在统计每个 aia_i 的倍数时,需要减去自身出现的次数,因为题目要求 iji \ne j

    2. 数值范围

    • n2×105n \leq 2 \times 10^5
    • ai5×105a_i \leq 5 \times 10^5
    • 频次数组大小:5×1055 \times 10^5

    3. 边界情况

    • ai=1a_i = 1 时,需要枚举所有数,但频次统计保证了效率
    • 重复数值需要正确计数

    算法优势

    1. 避免重复计算:通过频次统计,相同数值只需计算一次倍数关系
    2. 利用数值范围maxa\text{max}_a 有限,倍数枚举在可控范围内
    3. 简单高效:代码实现简洁,易于理解和调试

    算法标签

    • 数学
    • 计数
    • 倍数枚举
    • 频次统计

    总结

    本题通过将问题转化为频次统计倍数枚举,巧妙地避免了 O(n2)O(n^2) 的暴力枚举,在给定的数据范围内能够高效求解。核心在于发现数值范围的有限性,从而使用空间换时间的策略。

    • 1

    信息

    ID
    4184
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者