1 条题解
-
0
题目分析
我们要求的是: [ \sum_{i=0}^{n-1} \sum_{j=0}^{m-1} \max(i \oplus j - k, 0) \mod p ] 其中 表示按位异或运算。
问题转化
设
设 $C = \sum_{i=0}^{n-1} \sum_{j=0}^{m-1} [i \oplus j \le k]$那么原式可以写成: [ \text{答案} = S - k \cdot C ] 因为: [ \sum \max(i \oplus j - k, 0) = \sum_{i \oplus j > k} (i \oplus j - k) = S - k \cdot C ]
数位DP思路
由于 可能达到 ,我们需要用数位DP来处理。
定义状态:
- :考虑二进制前 位时, 的总和
- :考虑二进制前 位时,满足条件的方案数
其中:
- : 是否还受到 的限制
- : 是否还受到 的限制
- : 是否还受到 的限制(用于计算 )
状态转移
设当前位为 (从高位到低位), 的当前位, 的当前位, 的当前位。
对于总和 :
枚举 的当前位 (0或1), 的当前位 (0或1):
- 如果 且 且 ,不能选1
- 如果 且 且 ,不能选1
当前位的贡献是 ,乘以低位方案数,加上低位的总和。
对于计数 :
枚举 同上,但还要考虑 :
- 如果 且 ,不能选
- 如果 且 ,下一位继续受限制
- 如果 且 ,下一位不受限制
算法流程
- 将 二进制分解
- 用记忆化搜索计算:
- (计算总和时不受 限制)
- (计算计数时受 限制)
- 答案 =
代码实现细节
- 使用
long long
存储状态,注意取模 - 记忆化搜索时,状态用
pos, limN, limM, limK
表示 - 注意 可能为负数的情况(当 或 时)
时间复杂度
数位DP的状态数是 ,非常高效。
样例验证
以 为例:
- 原始表格:
0 1 2 1 0 3 2 3 0
- 减1后:
max(0,0) max(0,0) max(1,0) = 0 0 1 max(0,0) max(0,0) max(2,0) = 0 0 2 max(1,0) max(2,0) max(0,0) = 1 2 0
- 总和 = 0+0+1+0+0+2+1+2+0 = 6,符合输出。
总结
本题的关键在于:
- 将 转化为
- 使用数位DP同时计算异或和与方案数
- 注意边界情况和取模运算
这种方法可以处理 级别的数据,时间复杂度 。
- 1
信息
- ID
- 3225
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者