[做题记录] 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\)。这两条链都往左边的贡献是 :
这里的 \(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\) 个数, 当前位置有没有进位的方案数, 直接转移即可。