1 条题解

  • 0
    @ 2025-10-29 19:38:35

    题解

    问题分析

    题目要求计算在 nn 以内满足 P(x)=mP(x) = m 的正整数 xx 的数量,其中 P(x)P(x) 定义为满足 1<y<x1 < y < xy31(modx)y^3 \equiv 1 \pmod{x}yy 的数量。

    核心在于分析 P(x)P(x) 的性质:

    • 由中国剩余定理,若 xx 的素因子分解为 x=p1e1p2e2pkekx = p_1^{e_1} p_2^{e_2} \cdots p_k^{e_k},则同余方程 y31(modx)y^3 \equiv 1 \pmod{x} 的解的数量是各素数幂 pieip_i^{e_i} 上解的数量的乘积。
    • y=1y=1 始终是解,但 P(x)P(x) 仅计数 1<y<x1 < y < x 的解,因此 P(x)=t1P(x) = t - 1tt 为总解数,需减去 y=1y=1 的情况)。
    • 素数幂 pep^e 上的解数:
      • p2(mod3)p \equiv 2 \pmod{3}p=2p=2p=3p=3e=1e=1,解数为 11(仅 y=1y=1)。
      • p1(mod3)p \equiv 1 \pmod{3}p=3p=3e2e \geq 2,解数为 33(含 y=1y=1 和另外两个解)。

    由此可得:P(x)=3d1P(x) = 3^d - 1,其中 ddxx 的素因子分解中“解数为3的素数幂”的个数(即满足 p1(mod3)p \equiv 1 \pmod{3}p=3p=3e2e \geq 2 的素数幂的个数)。若 m+1m+1 不是 33 的幂,则答案为 00

    算法步骤

    1. 判断 m+1m+1 是否为 33 的幂:若不是,直接返回 00;若是,设 3d=m+13^d = m+1,需统计 xnx \leq n 中恰好含 dd 个“解数为3的素数幂”的数的数量。

    2. 素数计数准备

      • 用改进的筛法(类似 Meissel-Lehmer 算法)计算区间内素数总数(π(n)\pi(n))和 p1(mod3)p \equiv 1 \pmod{3} 的素数数量,支持高效查询。
    3. 深度优先搜索(DFS)计数

      • 递归枚举 dd 个“解数为3的素数幂”(彼此不同的素数),并统计剩余因子为“解数为1的素数幂”的组合数,确保乘积 n\leq n
      • 累计所有符合条件的 xx 的数量。

    代码解析

    • 素数计数模块(build 函数):预处理小范围(n\leq \sqrt{n})和大范围(>n> \sqrt{n})的素数数量及 p1(mod3)p \equiv 1 \pmod{3} 的素数数量,用于快速查询。
    • DFS 模块(dfs 函数):递归枚举 dd 个目标素数幂,结合素数计数结果计算符合条件的 xx 的数量,处理素数幂的不同次幂情况。
    • 主函数:判断 m+1m+1 是否为 33 的幂,初始化参数后调用 DFS 统计答案。

    复杂度分析

    • 时间复杂度:依赖于素数计数的效率和 DFS 枚举的深度,对于 n2×1010n \leq 2 \times 10^{10},通过分块和优化筛法可将复杂度控制在 O(n3/4/logn)O(n^{3/4} / \log n) 级别。
    • 空间复杂度:O(n)O(\sqrt{n}),用于存储小范围素数计数结果和中间变量。

    综上,该算法通过数论性质简化问题,结合高效素数计数和递归枚举,实现了对大规模数据的快速求解。

    • 1

    信息

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