1 条题解

  • 0
    @ 2026-4-23 23:43:22

    题目传送门喵

    题意分析

    给定三个十六进制字符串表示的整数 l,r,bl, r, b,长度均不超过 5000050000 个字符。求满足 lxrl \le x \le rx&b=bx \And b = b 的整数 xx 的个数,结果对 109+710^9+7 取模。

    按位与的条件等价于:bb 的二进制表示中为 11 的位,xx 的对应位也必须是 11;其余位可以任意取 0011。因此问题转化为:在区间 [l,r][l, r] 内统计有多少个数,其某些指定位必须为 11

    思路

    由于 l,rl, r 的二进制位数可达 4×50000=2000004 \times 50000 = 200000,无法直接枚举,需要使用数位 DP 在二进制位上进行计数。

    采用前缀和的思想,令 fif_i 表示 00ii 之间满足条件的数的个数,则本题答案为 frfl1f_r - f_{l-1}。于是需要实现数组 ff。那么思路也呼之欲出了,采用数位 DP 初始化 ff 数组,设计如下:

    iibb 均转换为二进制串,并补零到相同长度 L=max(len(i),len(b))L = \max(\text{len}(i), \text{len}(b))。从高位向低位逐位决策,记录当前是否已经“小于”ii(即是否解除上界约束)。

    • 状态 11:之前所有位都与 ii 相等,当前位仍受 ii 限制。

    • 状态 22:之前某位已经小于 NN,后续位可自由取值。

    设计转移:设当前位的 bb 值为 xx0011),ii 的当前位为 yy

    状态 11

    x=1x = 1 时,只能取 11,且必须 y=1y = 1,转移后仍为状态 11

    xx = 0 时,可取 0011

    00:若 y=0y = 0 则仍 状态 11,否则进入 状态 22

    11:必须 y=1y = 1,且仍 状态 11

    状态 22

    xx = 1 时,只能取 11,仍为状态 22

    xx = 0 时,可取 0011,有 22 种选择,仍为状态 22

    转移方程式fn=(状态 1+状态 2)modMf_n = (\text{状态 1} + \text{状态 2}) \bmod M

    一些细节(边界处理)

    b=0b = 0 时,条件恒成立,fn=n+1f_n = n+1,数位 DP 仍能正确计算(每位自由)。

    l=0l = 0 时,直接取 frf_r;否则需计算 fl1f_{l-1},为此实现一个十六进制减 11 的函数。

    代码思路

    读入 l,r,bl, r, b,转换为二进制,计算 frf_r,若 l0l \neq 0 则减去 fl1f_l-1,输出结果(记得取模喵)。

    复杂度分析

    时间复杂度:

    每个数位 DP 遍历 O(len)O(\text{len}) 位,总复杂度 O(len)O(\text{len})len2×105\text{len} \le 2\times 10^5以你谷评测姬的能力来看可以接受。

    空间复杂度(这个真的重要吗喵 qwq):

    存储二进制串需要 O(len)O(\text{len}) 空间。

    写代码时请注意

    代码中请使用迭代而非递归,避免栈溢出,且时间复杂度为线性。

    减法取模时记得加 mod\bmod109+710^9+7)保证结果非负喵。

    • 1

    信息

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