CF750G New Year and Binary Tree Paths

  • description
  • solution
  • code

description

题目链接

一颗无穷个节点的完全二叉树。

求有多少条树上的简单路径编号和为 s。

s≤1e15s\le 1e15s≤1e15

solution

  • 一条单链的情况

    考虑从节点xxx开始走一条节点个数是hhh的链(链长为h−1h-1h−1)

    假设从上往下一直往左子树走【x,2x,4x,8x...x,2x,4x,8x...x,2x,4x,8x...】

    则贡献为x∑i=0h−12i=(2h−1)xx\sum_{i=0}^{h-1}2^i=(2^h-1)xx∑i=0h−1​2i=(2h−1)x

    若链从下往上的第i∈[1,h)i\in[1,h)i∈[1,h)个点是右儿子,则会给标号和带来独立的∑j=0i−12j=2i−1\sum_{j=0}^{i-1}2^j=2^i-1∑j=0i−1​2j=2i−1贡献

    可以解出,xxx的取值只能是⌊s2h−1⌋\lfloor\frac{s}{2^h-1}\rfloor⌊2h−1s​⌋

    证明:假设取x−1x-1x−1,且这条长hhh的链全走右子树的贡献是:

    (2h−1)(x−1)+∑i=1h−1(2i−1)=2hx−x−2h+1+2h−1−h=(2h−1)x−h<(2h−1)x(2^h-1)(x-1)+\sum_{i=1}^{h-1}(2^i-1)=2^hx-x-2^h+1+2^h-1-h=(2^h-1)x-h< (2^h-1)x(2h−1)(x−1)+∑i=1h−1​(2i−1)=2hx−x−2h+1+2h−1−h=(2h−1)x−h<(2h−1)x

    这已经是最大的不是选xxx产生的可能贡献了,所以只能是xxx

    这里同样经典的,可以判断能否用【1,3,...,2h−1−11,3,...,2^{h-1}-11,3,...,2h−1−1】构造出s−(2h−1)xs-(2^h-1)xs−(2h−1)x,先用大的开始尝试(从最大的往小的开始一个一个试,有点类似倍增的思想不断逼近直到相等的感觉)

  • 分叉情况(两条子链在根节点拼接)

    假设根节点为xxx,设xxx左儿子开始向下的链长度为h1h_1h1​,右儿子开始向下的链长度为h2h_2h2​,枚举h1,h2∈[1,log2s]h_1,h_2\in[1,\text{log}_2^s]h1​,h2​∈[1,log2s​]

    假设这两条链都往各自的左儿子走,贡献是:

    x+2x(2h1−1)+(2x+1)(2h2−1)=(2h1+1+2h2+1−3)x+2h2−1x+2x(2^{h_1}-1)+(2x+1)(2^{h_2}-1)=(2^{h_1+1}+2^{h_2+1}-3)x+2^{h_2}-1x+2x(2h1​−1)+(2x+1)(2h2​−1)=(2h1​+1+2h2​+1−3)x+2h2​−1

    同理,xxx的位置也是唯一确定的,即⌊s−(2h2−1)2h1+1+2h2+1−3⌋\lfloor\frac{s-(2^{h_2}-1)}{2^{h_1+1}+2^{h_2+1}-3}\rfloor⌊2h1​+1+2h2​+1−3s−(2h2​−1)​⌋

    令t=st=st=s减去上面的贡献

    同时,考虑怎么用各自某一层走右儿子产生的贡献【1,3,...,2h1−1;1,3,...,2h2−11,3,...,2^{h_1}-1;1,3,...,2^{h_2}-11,3,...,2h1​−1;1,3,...,2h2​−1】来构造出ttt,转换一下考虑用【2,22,...,2h1;2,22,...,2h22,2^2,...,2^{h_1};2,2^2,...,2^{h_2}2,22,...,2h1​;2,22,...,2h2​】来凑ttt

    枚举选了nnn个数,判断能不能用这些数凑出t+nt+nt+n

    • 这里的实现考虑使用数位dpdpdp,O(h1h2)O(h_1h_2)O(h1​h2​)求出结果

      设fi,j,k:f_{i,j,k}:fi,j,k​: 前iii位h1h_1h1​和h2h_2h2​两条链的状态一共选了jjj个222的次方【可能选了222^222,2i−1...2^{i-1}...2i−1...,反正一共选了jjj个】,是否有进位k=1/0k=1/0k=1/0的方案数

      对于每一位枚举h1h_1h1​链和h2h_2h2​链上的选择情况s1,s2s_1,s_2s1​,s2​

      注意到,如果i=h1i=h_1i=h1​,这一位是不能选111【表示进位】的,h2h_2h2​同理

      则可以得到转移方程:f[i+1][j+s1+s2][s1+s2+k2]=∑f[i][j][k](s1+s2+k≡⌊t+n2i(mod2)⌋)f[i+1][j+s_1+s_2][\frac{s_1+s_2+k}{2}]=\sum f[i][j][k]\quad\Big(s_1+s_2+k\equiv \lfloor\frac{t+n}{2^i}\pmod 2\rfloor\Big)f[i+1][j+s1​+s2​][2s1​+s2​+k​]=∑f[i][j][k](s1​+s2​+k≡⌊2it+n​(mod2)⌋)

时间复杂度为O(log5s)O(\text{log}^5s)O(log5s)

code

#include <cmath>
#include <cstdio>
#include <cstring>
#define maxn 60
#define int long long
int s, m, now;
int f[2][maxn << 1][2], mi[maxn];int calc( int goal, int q, int h1, int h2, int cnt ) {memset( f[now], 0, sizeof( f[now] ) );f[now][0][0] = 1;for( int i = 1;i <= log2( goal ) + 1;i ++ ) {int d = goal >> i & 1;now ^= 1;memset( f[now], 0, sizeof( f[now] ) );for( int j = 0;j <= ( i - 1 << 1 );j ++ ) //到i-1及以前可以一共选了[0,(i-1)*2]个数 左儿子(h1)链的选择和右儿子(h2)链的选择 for( int k = 0;k <= 1;k ++ )if( f[now ^ 1][j][k] )for( int s1 = 0;s1 <= 1;s1 ++ )if( ! s1 or i < h1 )for( int s2 = 0;s2 <= 1;s2 ++ )if( ! s2 or i < h2 )if( ( k + s1 + s2 ) % 2 == d ) //判断同余 f[now][j + s1 + s2][( k + s1 + s2 ) / 2] += f[now ^ 1][j][k];}return f[now][cnt][0];
}signed main() {int ans = 0;scanf( "%lld", &s );mi[0] = 1;for( int i = 1;i < 60;i ++ ) {mi[i] = mi[i - 1] << 1;if( mi[i] > s and mi[i - 1] <= s ) m = i;}for( int i = 1;i <= m;i ++ ) { //单链的构造 int x = s / ( mi[i] - 1 );if( x <= 0 ) continue;int t = s - x * ( mi[i] - 1 );for( int j = i - 1;~ j;j -- )if( t >= mi[j] - 1 ) t -= mi[j] - 1;if( ! t ) ans ++;}for( int h1 = 1;h1 <= m;h1 ++ )for( int h2 = 1;mi[h2] - 1 <= s;h2 ++ ) {int x = ( s - mi[h2] + 1 ) / ( mi[h1 + 1] + mi[h2 + 1] - 3 );if( x <= 0 ) continue;int t = ( s - mi[h2] + 1 ) - x * ( mi[h1 + 1] + mi[h2 + 1] - 3 );if( ! t ) {  ans ++; continue; }if( h1 == 1 and h2 == 1 ) { ans += ( t == 5 * x + 1 ); continue; } //x 2x 2x+1 -> 5x+1for( int n = 1;n <= h1 + h2;n ++ ) //枚举选了n个右儿子 if( ( ( t + n ) & 1 ) == 0 ) ans += calc( t + n, x, h1, h2, n );}printf( "%lld\n", ans );return 0;
}

CF750G New Year and Binary Tree Paths(数位dp二进制+数学)相关推荐

  1. LeetCode刷题记录14——257. Binary Tree Paths(easy)

    LeetCode刷题记录14--257. Binary Tree Paths(easy) 目录 前言 题目 语言 思路 源码 后记 前言 数据结构感觉理论简单,实践起来很困难. 题目 给定一个二叉树, ...

  2. [LeetCode] Binary Tree Paths - 二叉树基础系列题目

    目录: 1.Binary Tree Paths - 求二叉树路径 2.Same Tree - 判断二叉树相等 3.Symmetric Tree - 判断二叉树对称镜像 Binary Tree Path ...

  3. Binary Tree Paths leetcode

    Binary Tree Paths Given a binary tree, return all root-to-leaf paths. For example, given the followi ...

  4. Binary Tree Paths

    Binary Tree Paths Given a binary tree, return all root-to-leaf paths. For example, given the followi ...

  5. 二叉树的路径(根节点到叶节点)Binary Tree Paths

    为什么80%的码农都做不了架构师?>>>    问题: Given a binary tree, return all root-to-leaf paths. For example ...

  6. 257. Binary Tree Paths

    Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1/ ...

  7. LeetCode OJ -- Binary Tree Paths

    http://blog.ubooksapp.com/ 标签(空格分隔): LeetCode OJ BinaryTree Given a binary tree, return all root-to- ...

  8. [LeetCode] Binary Tree Paths

    Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1/ ...

  9. C#LeetCode刷题之#257-二叉树的所有路径(Binary Tree Paths)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4082 访问. 给定一个二叉树,返回所有从根节点到叶子节点的路径. ...

最新文章

  1. python字符串格式化之学习笔记
  2. LeetCode Regular Expression Matching
  3. BAT批处理脚本结合SQL应用案例
  4. PrimeFaces Extensions中的全新JSF组件
  5. 机器学习算法应用30篇(十)-通俗理解支持向量机SVM及代码实践
  6. java I O类大全_Java I/O最简单的几个类
  7. 逆置/反转单链表(C语言)
  8. python可以自学编程吗-编程学习第一步,让你20天搞定Python编程
  9. 计算机用的代码怎么写,什么是代码,代码怎么写,怎么样写入电脑
  10. drozer报错解决
  11. 苹果呼叫转移设置不了_0广告,支持苹果,甜美小姐姐or磁性小哥哥做助理!
  12. [noip2011]铺地毯(carpet)解题报告
  13. 腾讯防水墙的使用(python_web)
  14. 关于idea单元测试键盘无法输入的解决方法(终极版)
  15. 沐阳从0到1零基础学习安卓逆向
  16. Date setMonth(date.getMonth - 1)
  17. 计算机图形学圆反走样代码,计算机图形学——反走样
  18. python中nums[:]和nums
  19. win7局域网自建ftp服务器,win7系统搭建FTp服务器局域网内传输文件的解决教程
  20. linux关闭ipv6dns,dns关闭ipv6

热门文章

  1. path manipulation怎么解决_干货!终于!解决macOS下pyenv安装python3.8.2缺少tkinter模块的问题!...
  2. python 数据驱动接口自动化框架_python接口自动化测试 - 数据驱动DDT模块的简单使用...
  3. 华为服务器如何用pe重装系统,教你华为u盘重装win10系统详细图文
  4. android bitmap string,Android Bitmap到Base64字符串(Android Bitmap to Base64 String)
  5. html5中外描边怎么写,CSS3实现文字描边的2种方法(小结)
  6. Linux链接文件包括,Linux操作系统——系统各目录有什么作用、以及文件链接过程...
  7. git pull 覆盖本地_SVN与Git比较的优缺点差异
  8. 吴恩达DeepLearningCourse2-改善深层神经网络:超参数调试、正则化以及优化
  9. 每天一小时python官方文档学习(四)————数据结构之列表
  10. [Redis6]常用数据结构_Hash哈希