[做题记录] CF750G New Year and Binary Tree Paths

题意

你有一棵无限大的完全二叉树, 编号和线段树的编号一致, 求这棵树上有多少条路径的权值和为 \(s\)

\(s \leq 10^{15}\)

题解

被教育了.jpg

首先考虑一条链的情况, 也就是 \(x\) 作为起点一直往下面都的情况。

不妨假设路径的长度为 \(h\) , 那么如果 \(x\) 一直往左边走, 这条路径的权值之和就是 \(x\times(2^h - 1)\) 。对于从下往上的第 \(i \in [1, h - 1]\) 个儿子会有 \(2^i - 1\) 的贡献。

然后这里有一个及其重要的性质, 就是一旦确定了 \(h\) , 那么 \(x\) 就确定了。没注意到这个性质直接自闭了好吧

这里的 \(x\) 一定会是 \(\frac{s}{2^h - 1}\) 下取整。

那么枚举 \(h\) 就可以了。

然后考虑一般的情况, 也就是左右两边都下去的情况。假设路径的 \(lca\)\(x\) 。左边的链长度是 \(h_1\), 右边的链长度是 \(h_2\)。这两条链都往左边的贡献是 :

\[v = (2^{h_1 + 1} + 2^{h_2 + 1} - 3)x + 2^{h_2} - 1 \]

这里的 \(x\) 显然也是确定的, 是 \(\frac{s - 2^{h2} + 1}{2^{h_1 + 1} + 2^{h_2 + 1} - 3}\)

\(r = s - v\), 考虑怎么把 \(r\) 凑出来。因为 \(2\) 的幂次显然更加好凑, 我们考虑枚举选了的数的数量 \(t\), 考虑用 \(2^1, 2^2, \cdots 2^{h_1}, 2^1, 2^2, \cdots, 2^{h_2}\) 凑出来 \(r + t\)

这个东西是很经典的数位DP。可以设 \(f_{i, j, k}\) 表示当前考虑到第 \(i + 1\) 位,选了 \(j\) 个数, 当前位置有没有进位的方案数, 直接转移即可。

posted @ 2021-12-21 17:06  HN-wrp  阅读(32)  评论(0编辑  收藏  举报