1 条题解
-
0
题解:花神的数论题
核心问题
求: [ \prod_{i=1}^N \text{sum}(i) \ (\text{mod } 10^7+7) ] 其中 是 的二进制表示中 的个数。
数据范围
,无法枚举,需用 数位 DP。
解题思路
将问题转化为:
对于每个可能的 的个数 ,计算在 中有多少个数其二进制恰有 个 ,记为 。
则答案为: [ \prod_{k=1}^{\text{max_bits}} k^{cnt[k]} \ (\text{mod } 10^7+7) ]数位 DP 设计:
- 状态:
dfs(pos, limit, sum)pos:当前处理到二进制第几位(从高位到低位)limit:是否受到 的限制sum:当前已选的 的数量
- 返回值:从当前状态开始,后续所有数对应的 乘积
转移时,当前位可选 或 (受限制时不能超过 的对应位),递归计算子问题乘积,乘起来即可。
代码要点
- 将 转为二进制数组
a[] - 用记忆化
f[pos][sum]加速(当limit=0时) - 递归边界:
pos=0时返回max(sum,1)(因为 ) - 所有乘法取模
时间复杂度
状态数 ,可高效处理 。
- 状态:
- 1
信息
- ID
- 6040
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者