题目链接

简单的

设从节点\(x\)开始不断往左儿子走h-1步,则编号和为\(x\sum_{i=0}^{h-1}2^i=x(2^h-1)\)。

若倒数第\(i\)步走向的是右儿子,则编号和会增加\(\sum_{j=0}^{i-1}2^j=2^i-1\)。

这样,从\(x\)往下走形成的长为\(h\)的链中,其中倒数\(i,i\in T\)步时走向右儿子,倒数\(i,i\not\in T\)步走向左儿子,这样得到的编号和为

\[x(2^h-1)+\sum_{i\in T}2^i-|T|=S
\]

令\(L=\lfloor\frac{S}{2^h-1}\rfloor\),显然\(|T|<h\le\log_2(S+1),x\le L\)。又因为

\[(L-1)(2^h-1)+\sum_{i\in T}2^i-|T|\le S-(2^h-1)+(2^h-h-1)\\
=S-h<S
\]

故\(x>L-1\)进而\(x=L\),或称对每个\(h\)有唯一的\(x=L\),那么方案数为方程\(\sum_{i\in T}2^i=S+|T|+L(2^h-1)\)的解的个数。(这显然最多只有一组解)

组合的

从节点\(x\)的左右儿子出发的两天简单链分别表示为\((h_0,T_0),(h_1,T_1)\),总的编号和

\[x+2x(2^{h_0}-1)+(2x+1)(2^{h_1}-1)+\sum_{i\in T_0}2^i+\sum_{i\in T_1}2^i-|T_0|-|T_1|\\
=x(2^{h_0+1}+2^{h_1+1}-3)+2^{h_1}-1+\sum_{i\in T_0}2^i+\sum_{i\in T_1}2^i-|T_0|-|T_1|=S
\]

大胆猜想\(h_0,h_1\)确定时有唯一的\(x=\lfloor\frac{S-2^{h_1}+1}{2^{h_0+1}+2^{h_1+1}-3}\rfloor\)。

接着问题转变为在\({2^1,2^2,\cdots,2^{h_0-1}},{2^1,2^2,\cdots,2^{h_1-1}}\)中一共选取\(n\)个数之和等于\(S-(\cdots)+n\)(QAQ)的方案数。

考虑枚举\(n\),设\(f[i,j,0/1]\)表示考虑完前\(i\)个指数后,已经选了\(j\)个数字,这一位(二进制末尾第\(i+1\)位)为是否进位的方案数。其中\(f[0,0,0]=1\)。

答案是\(\sum_{h_0,h_1}(\sum_n f[\max(h_0,h_1),n,0])\)。时间复杂度\(O(\log_2^5S)\)。

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=53; LL S,L,ans;
LL P[N]={1};
LL f[N][N*2][2]; int main() {
scanf("%lld",&S); L=log2(S+1);
for(int i=1; i<N; ++i) P[i]=P[i-1]<<1;
for(int h=1; h<=L; ++h) {
LL x=S%(P[h]-1);
for(int i=h; i; --i) if(x>=P[i]-1) x-=P[i]-1;
ans+=(!x);
}
for(int h0=1; h0<L; ++h0)
for(int h1=1; S+1-P[h1]>=P[h0+1]+P[h1+1]-3; ++h1) {
LL x=(S+1-P[h1])/(P[h0+1]+P[h1+1]-3);
LL r=(S+1-P[h1])%(P[h0+1]+P[h1+1]-3);
if(!r) {ans++; continue;}
if(h0==1&&h1==1) {ans+=(S==x*5+1); continue;}
for(int n=1; n<=h0+h1; ++n) {
LL C=r+n,L=log2(C);
if(C&1) continue;
memset(f[0],0,sizeof f[0]); f[0][0][0]=1;
for(int i=1; i<=L; ++i) {
int d=(C>>i)&1; memset(f[i],0,sizeof f[i]);
for(int j=0; j<=i+i-2&&j<=n; ++j)
for(int k=0; k<2; ++k) if(f[i-1][j][k])
for(int x=0; x<2; ++x) if(!x||i<h0)
for(int y=0; y<2; ++y) if(!y||i<h1)
if(((k+x+y)&1)==d) f[i][j+x+y][(k+x+y)>>1]+=f[i-1][j][k];
}
ans+=f[L][n][0];
}
}
printf("%lld\n",ans);
return 0;
}

不知道1K+ms是怎么跑出来的

[CF750G] New Year and Binary Tree Paths的更多相关文章

  1. CF750G New Year and Binary Tree Paths(DP)

    神仙题.为啥我第一眼看上去以为是个普及题 路径有两种,第一种是从 LCA 一边下去的,第二种是从 LCA 两边都下去了的. 先考虑第一种. 先枚举路径长度 \(h\). 当 LCA 编号是 \(x\) ...

  2. [LintCode] Binary Tree Paths 二叉树路径

    Given a binary tree, return all root-to-leaf paths.Example Given the following binary tree: 1 /   \2 ...

  3. LintCode Binary Tree Paths

    Binary Tree Paths Given a binary tree, return all root-to-leaf paths. Given the following binary tre ...

  4. 【LeetCode】257. Binary Tree Paths

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

  5. &lt;LeetCode OJ&gt; 257. Binary Tree Paths

    257. Binary Tree Paths Total Accepted: 29282 Total Submissions: 113527 Difficulty: Easy Given a bina ...

  6. LeetCode_257. Binary Tree Paths

    257. Binary Tree Paths Easy Given a binary tree, return all root-to-leaf paths. Note: A leaf is a no ...

  7. [LeetCode] Binary Tree Paths 二叉树路径

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

  8. leetcode : Binary Tree Paths

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

  9. Leetcode 257. Binary Tree Paths

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

随机推荐

  1. ar9331修改flash大小和df、cat /proc/mtd的区别

    首先感谢黄工的指导. 在openwrt固件目录下target/linux/ar71xx/image/Makefile,找到对应的机型,修改为4M,8M,16M,32M. 以oolite机型为例,如图所 ...

  2. vue-cli中route和router的区别

    在使用vue-router的时候经常分不清router和route的区别: 在函数式编程中: this.$router.push('/login') 或者Router.push() 在动态获取路由参数 ...

  3. VMware Guest customization fails on Linux

    1.1  症状现象 登录Guest OS,在/var/log/vmware-imc/toolsDeployPkg.log文件中,您会看到以下条目: Customization command fail ...

  4. python学习之路(9)

    函数的参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调 ...

  5. 论文阅读Graph Convolutional Matrix Completion

    摘要:我们从链路预测的视角考虑推荐系统的matrix completion.像电影评分的交互数据可以表示为一个user-item的二分图,其中的edge表示观测到的评分.这种表示是特别有用的在额外的基 ...

  6. python环境下安装virtualenv,virtualenvwrapper

    在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用 ...

  7. GC类型以及不同类型GC的搭配 1

    jvm内存分配,以及gc算法在上两篇博客中已经有所介绍.接下来我们重点分析不同gc器的特点和他们的搭配使用(并非任何一种新生代GC策略都可以和另一种年老代GC策略进行配合工作)

  8. 第六周学习总结&java实验报告四

    第六周学习总结&java实验报告四 学习总结: 上一周因为接近国庆假期,所以老师没有讲太多的新知识点,只要是带我们一起做了一个动物模拟变声器的实验,进一步了解和学习到继承的 有关知识点和应用: ...

  9. Electron对JQuery的支持问题

    最近在了解Electron框架写应用,偶然发现在html中使用<script src="./jquery.js"></script>这种方式引入JQuery ...

  10. if-else判断语句

    <1>if-else的使用格式 if 条件: 满足条件时要做的事情1 满足条件时要做的事情2 满足条件时要做的事情3 ...(省略)... else: 不满足条件时要做的事情1 不满足条件 ...