1 条题解

  • 0
    @ 2025-12-10 19:40:35

    题解:花神的数论题

    核心问题

    求: [ \prod_{i=1}^N \text{sum}(i) \ (\text{mod } 10^7+7) ] 其中 sum(i)\text{sum}(i)ii 的二进制表示中 11 的个数。

    数据范围

    N1015N \le 10^{15},无法枚举,需用 数位 DP

    解题思路

    将问题转化为:
    对于每个可能的 11 的个数 kk,计算在 [1,N][1,N] 中有多少个数其二进制恰有 kk11,记为 cnt[k]cnt[k]
    则答案为: [ \prod_{k=1}^{\text{max_bits}} k^{cnt[k]} \ (\text{mod } 10^7+7) ]

    数位 DP 设计:

    • 状态:dfs(pos, limit, sum)
      • pos:当前处理到二进制第几位(从高位到低位)
      • limit:是否受到 NN 的限制
      • sum:当前已选的 11 的数量
    • 返回值:从当前状态开始,后续所有数对应的 sum(i)\text{sum}(i) 乘积

    转移时,当前位可选 0011(受限制时不能超过 NN 的对应位),递归计算子问题乘积,乘起来即可。

    代码要点

    • NN 转为二进制数组 a[]
    • 用记忆化 f[pos][sum] 加速(当 limit=0 时)
    • 递归边界:pos=0 时返回 max(sum,1)(因为 sum(i)1\text{sum}(i) \ge 1
    • 所有乘法取模 107+710^7+7

    时间复杂度

    状态数 O(logN×logN)O(\log N \times \log N),可高效处理 N=1015N=10^{15}

    • 1

    信息

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