1 条题解
-
0
题意分析
给定三个十六进制字符串表示的整数 ,长度均不超过 个字符。求满足 且 的整数 的个数,结果对 取模。
按位与的条件等价于: 的二进制表示中为 的位, 的对应位也必须是 ;其余位可以任意取 或 。因此问题转化为:在区间 内统计有多少个数,其某些指定位必须为 。
思路
由于 的二进制位数可达 ,无法直接枚举,需要使用数位 DP 在二进制位上进行计数。
采用前缀和的思想,令 表示 到 之间满足条件的数的个数,则本题答案为 。于是需要实现数组 。那么思路也呼之欲出了,采用数位 DP 初始化 数组,设计如下:
将 和 均转换为二进制串,并补零到相同长度 。从高位向低位逐位决策,记录当前是否已经“小于”(即是否解除上界约束)。
-
状态 :之前所有位都与 相等,当前位仍受 限制。
-
状态 :之前某位已经小于 ,后续位可自由取值。
设计转移:设当前位的 值为 ( 或 ), 的当前位为 。
状态 :
当 时,只能取 ,且必须 ,转移后仍为状态 。
当 = 0 时,可取 或 :
取 :若 则仍 状态 ,否则进入 状态 。
取 :必须 ,且仍 状态 。
状态 :
当 = 1 时,只能取 ,仍为状态 。
当 = 0 时,可取 或 ,有 种选择,仍为状态 。
转移方程式:。
一些细节(边界处理)
时,条件恒成立,,数位 DP 仍能正确计算(每位自由)。
时,直接取 ;否则需计算 ,为此实现一个十六进制减 的函数。
代码思路
读入 ,转换为二进制,计算 ,若 则减去 ,输出结果(记得取模喵)。
复杂度分析
时间复杂度:
每个数位 DP 遍历 位,总复杂度 ,,
以你谷评测姬的能力来看可以接受。空间复杂度(
这个真的重要吗喵 qwq):存储二进制串需要 空间。
写代码时请注意
代码中请使用迭代而非递归,避免栈溢出,且时间复杂度为线性。
减法取模时记得加 ()保证结果非负喵。
-
- 1
信息
- ID
- 9651
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者