zoukankan      html  css  js  c++  java
  • [做题记录] CF750G New Year and Binary Tree Paths HN

    题意

    你有一棵无限大的完全二叉树, 编号和线段树的编号一致, 求这棵树上有多少条路径的权值和为 \(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\) 个数, 当前位置有没有进位的方案数, 直接转移即可。

  • 相关阅读:
    Git 9. 远程仓库
    Git 8. 删除文件
    Git 7. 撤销修改
    # 并发编程 -进程理论-进程的方法
    socket 上传 -- 异常处理--UDP协议 --自定义socket #29
    socket(套接字)
    面向过程补充 网络编程 #27
    ATM
    选课系统 -- # 25 -26
    面向对象高级 1.反射 2.元类 # 24
  • 原文地址:https://www.cnblogs.com/clover4/p/15716165.html
Copyright © 2011-2022 走看看