1 条题解
-
0
题意概述
有一棵深度为 的完全二叉树,节点值规则:
- 根为
- 左儿子值 = 父节点值 × 2
- 右儿子值 = 父节点值 × 2 + 1
叶子节点深度为 ,共 个叶子,值为 。
Ena 知道一条正确的路径 (长度为 的 L/R 串),但她分不清左右,可以在行走过程中恰好改变 次对左右的定义,且初始时可能正确也可能错误(即初始方向有两种可能)。
改变定义后,她会一直按新定义行走,直到下一次改变或到达叶子。问:在所有可能的实际行走路径中(受 次改变约束),最终到达的叶子节点值如果在 范围内,则将这些叶子值求和(模 )。
问题转化
1. 实际路径与正确路径的关系
设正确路径 的每个字符表示实际方向(Ena 认为的左右是未知的)。
Ena 初始有两种可能:- 初始正确:L 表示真左,R 表示真右
- 初始错误:L 表示真右,R 表示真左
行走过程中,她可以在某些步骤前“改变定义”,相当于翻转 L/R 的对应关系。
恰好改变 次,意味着从根到叶子,定义被翻转了 次。因此,对于每个实际行走路径,可以看作是 的某些位置被“翻转”(L↔R)后得到的串,且翻转次数为 (注意初始方向也算一种初始状态,但不算一次改变)。
2. 翻转次数限制
设初始方向正确为状态 0,错误为状态 1。
每改变一次定义,状态 0↔1 翻转。
恰好改变 次意味着:从初始状态开始,经过 次翻转到达叶子时,最终状态任意(0 或 1)。注意:改变只能发生在移动之前(包括第一步前),所以最多有 个改变时机(根出发前 + 每次移动前),但总改变次数固定为 。
3. 路径与节点值
给定一个实际行走的 L/R 序列 (长度为 ),从根出发按 走,到达的叶子节点值可以用二进制表示:
- 根为 1(二进制
1) - 走左:末尾加 0
- 走右:末尾加 1
因此,路径 对应一个二进制数:最高位是 1,后面 位由 决定(L=0, R=1)。
设 对应的正确路径二进制表示为 (已知)。
翻转某些位(L↔R)相当于对应二进制位取反(0↔1)。
模型简化
设 的二进制表示(去掉最高位 1)为 (,L=0, R=1)。
初始状态 :- :实际位 =
- :实际位 =
每次改变定义相当于 翻转(0↔1)。
恰好 次改变意味着:在 步中,有 次 翻转(包括可能的第一步前翻转,但那是初始状态选择的一部分)。设 表示在第 步之前是否改变定义( 表示改变), 对应第一步前是否改变(即初始状态是否为 1)。
,且 $s_i = s_0 \oplus (t_1 \oplus t_2 \oplus \dots \oplus t_i)$。则第 步的实际方向位: [ \text{实际位}i = s{i-1} \oplus b_i \quad (\text{当 } s=0 \text{ 时 } b_i,\ s=1 \text{ 时 } 1-b_i) ] 其中 是执行第 步前的状态。
目标
我们要求所有可能的 (满足 )对应的实际路径的叶子值,若该值在 内,则累加。
设实际路径二进制位为 (),则叶子值为: [ val = 2^{N-1} + \sum_{i=1}^{N-1} c_i \cdot 2^{N-1-i} ] 即 是 后接 的二进制数。
转化为 DP 问题
我们可以在二叉树的深度上 DP,同时跟踪:
- 当前深度 (从 0 到 ,根深度 0)
- 已改变的次数 (0 到 )
- 当前方向状态 (0 或 1)
- 当前路径值 (但 范围太大,不能直接存)
由于我们只关心最终叶子值是否在 内并求和,可以用数位 DP 的思路:
按二进制位从高到低(即树的深度从上到下)决定 ,同时跟踪 和 。
更简洁的方法:直接枚举最终二进制
设最终实际路径二进制位 。
已知 ,要存在 和改变序列使得 。递推: [ c_i \oplus b_i = s_{i-1} ] 而 ,所以 $t_i = s_{i-1} \oplus s_i = (c_i \oplus b_i) \oplus (c_{i+1} \oplus b_{i+1})$。
因此,给定 序列,可以算出 : [ t_i = (c_i \oplus b_i) \oplus (c_{i+1} \oplus b_{i+1}), \quad i=1,\dots,N-2 ] 以及 注意最后一步后没有下一次 ,所以 只能通过总改变次数约束。
还需要初始状态 ,并且总改变次数 (这里的 包括第一步前的改变吗?注意 就是第一步前的改变,它使 由默认 0 变为 1,所以初始 直接由 决定,不需要额外 变量?需要统一)
我们重新定义:
设初始 自由选择 0 或 1,然后在第 步前改变 次(),。
那么 。
且 。给定 ,我们可以反推 : [ 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})$ 对 成立。 对于 , 已知, 不存在, 不确定。
但总改变次数 ,且 之间由 决定(除了 自由)。
因此,给定 ,我们可以检查是否存在 满足总改变次数为 。更简单:设 ,则 。
那么 对 成立。
任意(0 或 1)。
总改变次数 $T = \sum_{i=1}^{N-2} (d_i \oplus d_{i+1}) + t_{N-1}$ 必须等于 。所以 可以调节,使得 与 奇偶性相同且 。
条件总结
对于给定的 ,令 ,则: [ M = \sum_{i=1}^{N-2} (d_i \oplus d_{i+1}) ] 必须满足 ,且 的奇偶性允许 取 0 或 1(其实 只能是 0 或 1,因为 或 1)。
因此条件: 或 。
问题转化为
枚举所有长度为 的二进制串 (对应叶子值 ),满足 ,且
设 ,计算 ,
若 或 ,则累加 。
数位 DP 实现
从高位到低位(深度 1 到 )DP: 状态:
- 当前位置 (1 到 )
- 当前 的值(0/1)
- 当前已产生的 值(即相邻 不同的次数)
- 当前 与 的大小关系(小于/等于/大于,标准数位 DP 的 limit 状态)
但 最大 ,,所以状态数 ,, 可过。
转移时,枚举当前位 (0/1),则 , 增加当且仅当 ()。
最终在 时检查 是否满足 或 ,累加 。
注意 可能很大,要在 DP 中直接累加和(模 )。
初始方向处理
以上推导假设初始 是自由的,但实际上初始 (因为 )。
所以 由 和 决定,没有额外自由度。
但是否允许 调整使得 或 总是成立?
是的,因为 可以取 0 或 1,所以 与 最多差 1。但有一个细节:如果 ,则 ,意味着最后一步前改变定义,这允许吗?是的,题目说“在移动之前改变主意”,最后一步前也可以改变。
最终算法
- 读入 。
- 将 转为二进制数组 (L=0, R=1)。
- 将 转为二进制(长度为 ,最高位为 1)。
- 数位 DP:
- 状态 表示: 考虑到第 位(1-based),上一位 的值( 时用特殊值表示无前驱),当前 值, 是否已小于 ,是否已大于 。
- 转移枚举 ,计算 ,更新 (若 且 则 +1),更新 界限。
- 最终 时(实际是 位结束),检查 是否等于 或 ,若是,累加 ( 在 DP 过程中逐步构建)。
- 输出累加和模 。
复杂度:(状态 ,转移 2), 可过。
总结
本题核心是分析 Ena 的混淆方向与改变行为,转化为二进制串的相邻位变化计数问题,最后用数位 DP 统计满足条件的叶子值之和。
关键步骤:- 将路径转为二进制。
- 推导出相邻位差异次数 与 的关系。
- 用数位 DP 枚举所有可能的实际路径,检查 条件并累加值在 内的叶子节点值。
- 1
信息
- ID
- 5743
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者