1 条题解

  • 0
    @ 2025-12-2 11:26:22

    题意概述

    有一棵深度为 NN 的完全二叉树,节点值规则:

    • 根为 11
    • 左儿子值 = 父节点值 × 2
    • 右儿子值 = 父节点值 × 2 + 1

    叶子节点深度为 NN,共 2N12^{N-1} 个叶子,值为 [2N1,2N1][2^{N-1}, 2^N-1]

    Ena 知道一条正确的路径 PP(长度为 N1N-1 的 L/R 串),但她分不清左右,可以在行走过程中恰好改变 KK 次对左右的定义,且初始时可能正确也可能错误(即初始方向有两种可能)。
    改变定义后,她会一直按新定义行走,直到下一次改变或到达叶子。

    问:在所有可能的实际行走路径中(受 KK 次改变约束),最终到达的叶子节点值如果在 [A,B][A, B] 范围内,则将这些叶子值求和(模 109+710^9+7)。


    问题转化

    1. 实际路径与正确路径的关系

    设正确路径 PP 的每个字符表示实际方向(Ena 认为的左右是未知的)。
    Ena 初始有两种可能:

    • 初始正确:L 表示真左,R 表示真右
    • 初始错误:L 表示真右,R 表示真左

    行走过程中,她可以在某些步骤前“改变定义”,相当于翻转 L/R 的对应关系。
    恰好改变 KK 次,意味着从根到叶子,定义被翻转了 KK 次。

    因此,对于每个实际行走路径,可以看作是 PP 的某些位置被“翻转”(L↔R)后得到的串,且翻转次数为 KK(注意初始方向也算一种初始状态,但不算一次改变)。


    2. 翻转次数限制

    设初始方向正确为状态 0,错误为状态 1。
    每改变一次定义,状态 0↔1 翻转。
    恰好改变 KK 次意味着:从初始状态开始,经过 KK 次翻转到达叶子时,最终状态任意(0 或 1)。

    注意:改变只能发生在移动之前(包括第一步前),所以最多有 NN 个改变时机(根出发前 + 每次移动前),但总改变次数固定为 KK


    3. 路径与节点值

    给定一个实际行走的 L/R 序列 QQ(长度为 N1N-1),从根出发按 QQ 走,到达的叶子节点值可以用二进制表示:

    • 根为 1(二进制 1
    • 走左:末尾加 0
    • 走右:末尾加 1

    因此,路径 QQ 对应一个二进制数:最高位是 1,后面 N1N-1 位由 QQ 决定(L=0, R=1)。

    PP 对应的正确路径二进制表示为 valPval_P(已知)。
    翻转某些位(L↔R)相当于对应二进制位取反(0↔1)。


    模型简化

    PP 的二进制表示(去掉最高位 1)为 b1b2bN1b_1 b_2 \dots b_{N-1}bi{0,1}b_i \in \{0,1\},L=0, R=1)。
    初始状态 s0{0,1}s_0 \in \{0,1\}

    • s0=0s_0=0:实际位 = bib_i
    • s0=1s_0=1:实际位 = 1bi1 - b_i

    每次改变定义相当于 ss 翻转(0↔1)。
    恰好 KK 次改变意味着:在 N1N-1 步中,有 KKss 翻转(包括可能的第一步前翻转,但那是初始状态选择的一部分)。

    tit_i 表示在第 ii 步之前是否改变定义(ti=1t_i=1 表示改变),t1t_1 对应第一步前是否改变(即初始状态是否为 1)。
    t1+t2++tN1=Kt_1 + t_2 + \dots + t_{N-1} = K,且 $s_i = s_0 \oplus (t_1 \oplus t_2 \oplus \dots \oplus t_i)$。

    则第 ii 步的实际方向位: [ \text{实际位}i = s{i-1} \oplus b_i \quad (\text{当 } s=0 \text{ 时 } b_i,\ s=1 \text{ 时 } 1-b_i) ] 其中 si1s_{i-1} 是执行第 ii 步前的状态。


    目标

    我们要求所有可能的 (s0,t1,,tN1)(s_0, t_1,\dots,t_{N-1})(满足 ti=K\sum t_i = K)对应的实际路径的叶子值,若该值在 [A,B][A,B] 内,则累加。

    设实际路径二进制位为 c1c2cN1c_1 c_2 \dots c_{N-1}ci=si1bic_i = s_{i-1} \oplus b_i),则叶子值为: [ val = 2^{N-1} + \sum_{i=1}^{N-1} c_i \cdot 2^{N-1-i} ] 即 valval11 后接 c1cN1c_1\dots c_{N-1} 的二进制数。


    转化为 DP 问题

    我们可以在二叉树的深度上 DP,同时跟踪:

    • 当前深度 dd(从 0 到 N1N-1,根深度 0)
    • 已改变的次数 kk(0 到 KK
    • 当前方向状态 ss(0 或 1)
    • 当前路径值 vv(但 vv 范围太大,不能直接存)

    由于我们只关心最终叶子值是否在 [A,B][A,B] 内并求和,可以用数位 DP 的思路:
    按二进制位从高到低(即树的深度从上到下)决定 cic_i,同时跟踪 kkss


    更简洁的方法:直接枚举最终二进制

    设最终实际路径二进制位 c1cN1c_1\dots c_{N-1}
    已知 bib_i,要存在 s0s_0 和改变序列使得 ci=si1bic_i = s_{i-1} \oplus b_i

    递推: [ c_i \oplus b_i = s_{i-1} ] 而 si=si1tis_i = s_{i-1} \oplus t_i,所以 $t_i = s_{i-1} \oplus s_i = (c_i \oplus b_i) \oplus (c_{i+1} \oplus b_{i+1})$。

    因此,给定 cc 序列,可以算出 tit_i: [ t_i = (c_i \oplus b_i) \oplus (c_{i+1} \oplus b_{i+1}), \quad i=1,\dots,N-2 ] 以及 tN1=?t_{N-1} = ? 注意最后一步后没有下一次 ss,所以 tN1t_{N-1} 只能通过总改变次数约束。

    还需要初始状态 s0=c1b1s_0 = c_1 \oplus b_1,并且总改变次数 i=1N1ti=K\sum_{i=1}^{N-1} t_i = K(这里的 tit_i 包括第一步前的改变吗?注意 t1t_1 就是第一步前的改变,它使 s0s_0 由默认 0 变为 1,所以初始 s0s_0 直接由 c1b1c_1\oplus b_1 决定,不需要额外 t1t_1 变量?需要统一)

    我们重新定义:
    设初始 s0s_0 自由选择 0 或 1,然后在第 ii 步前改变 tit_i 次(ti=0/1t_i=0/1),i=1..N1i=1..N-1
    那么 si=s0j=1itjs_i = s_0 \oplus \oplus_{j=1}^{i} t_j
    ci=si1bic_i = s_{i-1} \oplus b_i

    给定 cc,我们可以反推 tit_i: [ s_{i-1} = c_i \oplus b_i ] [ s_i = c_{i+1} \oplus b_{i+1} ] 所以 $t_i = s_{i-1} \oplus s_i = (c_i \oplus b_i) \oplus (c_{i+1} \oplus b_{i+1})$ 对 i=1..N2i=1..N-2 成立。 对于 i=N1i=N-1sN1s_{N-1} 已知,sNs_N 不存在,tN1t_{N-1} 不确定。

    但总改变次数 i=1N1ti=K\sum_{i=1}^{N-1} t_i = K,且 tit_i 之间由 cc 决定(除了 tN1t_{N-1} 自由)。
    因此,给定 cc,我们可以检查是否存在 tN1t_{N-1} 满足总改变次数为 KK

    更简单:设 di=cibid_i = c_i \oplus b_i,则 si1=dis_{i-1} = d_i
    那么 ti=didi+1t_i = d_i \oplus d_{i+1}i=1..N2i=1..N-2 成立。
    tN1t_{N-1} 任意(0 或 1)。
    总改变次数 $T = \sum_{i=1}^{N-2} (d_i \oplus d_{i+1}) + t_{N-1}$ 必须等于 KK

    所以 tN1t_{N-1} 可以调节,使得 TTKK 奇偶性相同且 Ki=1N2(didi+1)1|K - \sum_{i=1}^{N-2} (d_i \oplus d_{i+1})| \le 1


    条件总结

    对于给定的 cc,令 di=cibid_i = c_i \oplus b_i,则: [ M = \sum_{i=1}^{N-2} (d_i \oplus d_{i+1}) ] 必须满足 MKM+1M \le K \le M+1,且 KMK-M 的奇偶性允许 tN1t_{N-1} 取 0 或 1(其实 KMK-M 只能是 0 或 1,因为 tN1=0t_{N-1}=0 或 1)。

    因此条件:K=MK = MK=M+1K = M+1


    问题转化为

    枚举所有长度为 N1N-1 的二进制串 cc(对应叶子值 val=2N1+ci2N1ival = 2^{N-1} + \sum c_i 2^{N-1-i}),满足 AvalBA \le val \le B,且
    di=cibid_i = c_i \oplus b_i,计算 M=i=1N2[didi+1]M = \sum_{i=1}^{N-2} [d_i \neq d_{i+1}]
    K=MK = MK=M+1K = M+1,则累加 valval


    数位 DP 实现

    从高位到低位(深度 1 到 N1N-1)DP: 状态:

    • 当前位置 pospos(1 到 N1N-1
    • 当前 dposd_{pos} 的值(0/1)
    • 当前已产生的 MM 值(即相邻 dd 不同的次数)
    • 当前 valvalA,BA,B 的大小关系(小于/等于/大于,标准数位 DP 的 limit 状态)

    MM 最大 NNKNK \le N,所以状态数 O(N2)O(N^2)N1000N \le 1000O(N2)O(N^2) 可过。

    转移时,枚举当前位 cic_i(0/1),则 di=cibid_i = c_i \oplus b_iMM 增加当且仅当 didi1d_i \neq d_{i-1}i>1i>1)。

    最终在 pos=N1pos = N-1 时检查 MM 是否满足 K=MK = MK=M+1K = M+1,累加 valval

    注意 valval 可能很大,要在 DP 中直接累加和(模 109+710^9+7)。


    初始方向处理

    以上推导假设初始 s0s_0 是自由的,但实际上初始 s0=d1s_0 = d_1(因为 d1=c1b1=s0d_1 = c_1 \oplus b_1 = s_0)。
    所以 s0s_0c1c_1b1b_1 决定,没有额外自由度。
    但是否允许 tN1t_{N-1} 调整使得 K=MK = MK=M+1K = M+1 总是成立?
    是的,因为 tN1t_{N-1} 可以取 0 或 1,所以 KKMM 最多差 1。

    但有一个细节:如果 K=M+1K = M+1,则 tN1=1t_{N-1}=1,意味着最后一步前改变定义,这允许吗?是的,题目说“在移动之前改变主意”,最后一步前也可以改变。


    最终算法

    1. 读入 N,K,P,A,BN,K,P,A,B
    2. PP 转为二进制数组 b[1..N1]b[1..N-1](L=0, R=1)。
    3. A,BA,B 转为二进制(长度为 NN,最高位为 1)。
    4. 数位 DP:
      • 状态 dp[pos][dprev][M][flaglow][flaghigh]dp[pos][d_prev][M][flag_low][flag_high] 表示: 考虑到第 pospos 位(1-based),上一位 dpos1d_{pos-1} 的值(pos=1pos=1 时用特殊值表示无前驱),当前 MM 值,valval 是否已小于 BB,是否已大于 AA
      • 转移枚举 cpos{0,1}c_{pos} \in \{0,1\},计算 dpos=cposbposd_{pos} = c_{pos} \oplus b_{pos},更新 MM(若 pos>1pos>1dposdprevd_{pos} \neq d_{prev} 则 +1),更新 valval 界限。
      • 最终 pos=Npos = N 时(实际是 N1N-1 位结束),检查 MM 是否等于 KKK1K-1,若是,累加 valvalvalval 在 DP 过程中逐步构建)。
    5. 输出累加和模 109+710^9+7

    复杂度:O(N24)O(N^2 \cdot 4)(状态 posN4pos \cdot N \cdot 4,转移 2),N=1000N=1000 可过。


    总结

    本题核心是分析 Ena 的混淆方向与改变行为,转化为二进制串的相邻位变化计数问题,最后用数位 DP 统计满足条件的叶子值之和。
    关键步骤:

    1. 将路径转为二进制。
    2. 推导出相邻位差异次数 MMKK 的关系。
    3. 用数位 DP 枚举所有可能的实际路径,检查 MM 条件并累加值在 [A,B][A,B] 内的叶子节点值。
    • 1

    信息

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