1 条题解

  • 0
    @ 2026-4-9 18:01:16

    题意简述

    有一棵大小为 2n12^n - 1 的完美二叉树,节点编号 112n12^n - 1,根为 11,节点 vv 的左孩子为 2v2v,右孩子为 2v+12v + 1
    初始所有节点值为 00

    一次 add 操作:选择节点 vv,将根节点到 vv 路径上的所有节点值加 11
    执行恰好 kk 次 add 操作后,得到一棵树。要求该树同时满足:

    • 最大堆性质:对任意非叶子节点 vv,有 ava2va_v \ge a_{2v}ava2v+1a_v \ge a_{2v + 1}
    • 确定性:第一次执行 pop 操作时,每一步选择的子节点唯一,即对于每个非叶子节点 vv,必须满足 a2va2v+1a_{2v} \neq a_{2v + 1}

    问:有多少种不同的最终堆(按节点值区分),结果对给定素数 pp 取模。


    核心转化

    1. 子树操作次数模型

    一次 add 操作选择节点 uu,会使得 uu 的所有祖先的值加 11
    因此,最终节点 vv 的值 ava_v 等于 vv 为根的子树中被选中的 add 操作次数

    s(v)=avs(v) = a_v,则:

    • s(v)s(v) 是非负整数,表示 vv 的子树内的总操作次数。
    • 对任意非叶子 vv,最大堆性质等价于:s(v)s(2v),s(v)s(2v+1)s(v) \ge s(2v), \quad s(v) \ge s(2v + 1)
    • 确定性条件等价于:s(2v)s(2v+1)s(2v) \neq s(2v + 1)

    并且,所有节点的 s(v)s(v) 并非独立,它们满足递推关系:

    s(v)=selfv+s(2v)+s(2v+1)s(v) = \text{self}_v + s(2v) + s(2v + 1)

    其中 selfv\text{self}_v 是节点 vv 自身作为 add 目标被选中的次数。


    2. 确定性条件的结构

    从根开始,s(2)s(3)s(2) \neq s(3),不妨设 s(2)>s(3)s(2) > s(3),则 pop 走向节点 22
    接着 s(4)s(5)s(4) \neq s(5),依此类推。

    因此,存在一条从根到某个叶子的唯一路径,称为 主路径,每一步都走向值较大的子节点,且路径上每个内部节点的两个子节点值严格不等。

    设主路径为:

    p0=1,  p1,  p2,  ,  pn1p_0 = 1,\; p_1,\; p_2,\; \dots,\; p_{n-1}

    其中 pn1p_{n-1} 是叶子。
    bi=s(pi)b_i = s(p_i),则:

    b0b1bn10b_0 \ge b_1 \ge \dots \ge b_{n-1} \ge 0

    并且对于每个 ii0in20 \le i \le n-2),另一个子节点(不在主路径上)的值严格小于 bi+1b_{i+1}


    3. 非关键子树

    对于主路径上的节点 pip_i,它的另一个子节点称为 旁支根,其子树是一个 非关键子树
    这些非关键子树之间相互独立,且每个非关键子树的根值必须严格小于主路径上对应兄弟节点的值(即 bi+1b_{i+1})。

    非关键子树内部也必须是确定性最大堆,结构相同但规模更小(高度递减)。

    因此,整个结构可以递归描述:

    • 主路径将树分割成若干独立的、高度递减的完美二叉树(非关键子树)。
    • 每个非关键子树的形式与原问题相同,只是高度更小。

    动态规划设计

    定义状态

    设:

    $$dp[i][j] = \text{高度为 } i \text{ 的完美二叉树(大小 } 2^i - 1\text{),且该子树内总操作次数为 } j \text{ 的方案数} $$

    注意:子树总操作次数等于该子树根节点的值 s(root)s(\text{root})

    边界条件

    高度 i=1i = 1 时,树只有一个节点,总操作次数 jj 只能由该节点自身被选中 jj 次得到,只有 11 种方案。
    因此:

    dp[1][j]=1,0jkdp[1][j] = 1, \quad \forall 0 \le j \le k

    转移方程

    考虑高度 i+1i+1 的树,根为 RR,左右子树高度为 ii,根分别为 LLRcR_c
    确定性条件要求 s(L)>s(Rc)s(L) > s(R_c)(由对称性,固定左 > 右,最后会通过对称性处理)。

    设左子树总操作次数 j=s(L)j = s(L),右子树总操作次数 x=s(Rc)x = s(R_c),则必须满足 0x<j0 \le x < j
    根节点 RR 的总操作次数 l=s(R)l = s(R) 满足:

    l=j+x+r,r0l = j + x + r, \quad r \ge 0

    其中 rrRR 自身被选中的次数。

    对于固定的 jjxx

    • 左子树(主路径部分)有 dp[i][j]dp[i][j] 种内部方案。
    • 右子树(非关键子树)有 (x+2i2x)\displaystyle \binom{x + 2^i - 2}{x} 种内部方案。
      这是因为右子树有 2i12^i - 1 个节点,将 xx 次不可区分的操作分配到这些节点上(每个节点可被选多次,顺序无关),方案数为 $\binom{x + (2^i - 1) - 1}{x} = \binom{x + 2^i - 2}{x}$。

    因此,对于每个 lj+xl \ge j + x,贡献为 dp[i][j](x+2i2x)dp[i][j] \cdot \binom{x + 2^i - 2}{x}

    在实现中,我们先计算 nxt[t]nxt[t] 表示恰好 t=j+xt = j + x 时的贡献:

    $$nxt[j + x] \mathrel{+}= dp[i][j] \cdot \binom{x + 2^i - 2}{x} $$

    然后通过前缀和:

    dp[i+1][l]=t=0lnxt[t]dp[i+1][l] = \sum_{t=0}^{l} nxt[t]

    这样就在 O(k2)O(k^2) 内完成了从 iii+1i+1 的转移。

    组合数预处理

    由于 pp 是素数,我们可以预处理阶乘 facfac 和阶乘逆元 facifaci
    标程中采用了递推方式计算:

    binom[x]=(x+2i2x)\text{binom}[x] = \binom{x + 2^i - 2}{x}

    递推公式:

    $$\text{binom}[0] = 1, \quad \text{binom}[x] = \text{binom}[x-1] \cdot \frac{x + 2^i - 2}{x} \pmod p $$

    因为:

    $$\binom{x + m}{x} = \binom{x-1 + m}{x-1} \cdot \frac{x + m}{x} $$

    这里 m=2i2m = 2^i - 2


    对称性与最终答案

    上述 DP 固定了主路径为“每次走左子节点”的情况。
    由于完美二叉树的对称性,以任意叶子作为主路径终点的方案数相同。
    叶子共有 2n12^{n-1} 片,因此最终答案为:

    ans=dp[n][k]×2n1(modp)\text{ans} = dp[n][k] \times 2^{n-1} \pmod p

    其中 dp[n][k]dp[n][k] 是标程中最后得到的 dp[k]dp[k]


    复杂度分析

    • 预处理阶乘与逆元:O(k)O(k)
    • 每个高度 ii 计算组合数:O(k)O(k)
    • 每个高度 ii 的转移:枚举 jjxxO(k2)O(k^2)
    • 总高度 n500n \le 500k500k \le 500,总复杂度 O(nk2)1.25×108O(n k^2) \le 1.25 \times 10^8,在 3 秒内可通过(C++ 优化)。

    总结

    本题的核心在于:

    1. 将堆的值转化为子树操作次数。
    2. 利用确定性条件引出主路径与非关键子树结构。
    3. 非关键子树的计数归结为组合数。
    4. 动态规划自底向上合并,利用前缀和优化。
    5. 由对称性乘上叶子数得到最终答案。

    标程即实现上述过程。

    • 1

    信息

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