[CF750G] New Year and Binary Tree Paths
简单的
设从节点\(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\)步走向左儿子,这样得到的编号和为
\]
令\(L=\lfloor\frac{S}{2^h-1}\rfloor\),显然\(|T|<h\le\log_2(S+1),x\le L\)。又因为
=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(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的更多相关文章
- CF750G New Year and Binary Tree Paths(DP)
神仙题.为啥我第一眼看上去以为是个普及题 路径有两种,第一种是从 LCA 一边下去的,第二种是从 LCA 两边都下去了的. 先考虑第一种. 先枚举路径长度 \(h\). 当 LCA 编号是 \(x\) ...
- [LintCode] Binary Tree Paths 二叉树路径
Given a binary tree, return all root-to-leaf paths.Example Given the following binary tree: 1 / \2 ...
- LintCode Binary Tree Paths
Binary Tree Paths Given a binary tree, return all root-to-leaf paths. Given the following binary tre ...
- 【LeetCode】257. Binary Tree Paths
Binary Tree Paths Given a binary tree, return all root-to-leaf paths. For example, given the followi ...
- <LeetCode OJ> 257. Binary Tree Paths
257. Binary Tree Paths Total Accepted: 29282 Total Submissions: 113527 Difficulty: Easy Given a bina ...
- 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 ...
- [LeetCode] Binary Tree Paths 二叉树路径
Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...
- leetcode : Binary Tree Paths
Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...
- Leetcode 257. Binary Tree Paths
Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...
随机推荐
- Nowcoder Playing Games ( FWT 优化 DP && 博弈论 && 线性基)
题目链接 题意 : 给出 N 个数.然后问你最多取出多少石子使得在 NIM 博弈中.后手必胜 分析 : Nim 博弈模型,后手必胜当且仅当各个堆的石子的数目的异或和为 0 转化一下.变成最少取多少石 ...
- cat:连接文件并打印输出到标准输出设备
是 concatenate(连接.连续)的简写.cat 命令可以用来显示文本文件的内容,也可以把几个文件内容附加到另一个文件中,即连接合并文件. cat 命令的基本格式如下: [root@localh ...
- python爬取智联招聘职位信息(单进程)
我们先通过百度搜索智联招聘,进入智联招聘官网,一看,傻眼了,需要登录才能查看招聘信息 没办法,用账号登录进去,登录后的网页如下: 输入职位名称点击搜索,显示如下网页: 把这个URL:https://s ...
- Spring boot之使用thymeleaf
操作步骤 (1)在pom.xml中引入thymeleaf; (2)如何关闭thymeleaf缓存 (3)编写模板文件.html (4)编写访问模板文件controller 在pom.xml中引入thy ...
- jpa hibernate mybatis
jpa: entityManagerFactory: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean hibern ...
- Java连接MQTT服务-tcp方式
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- Android 客户端应用开发结构框架
本文算是一篇漫谈,谈一谈关于android开发中工程初始化的时候如何在初期我们就能搭建一个好的架构.关于android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角度,看到整齐 ...
- python自然语言处理学习笔记2
基础语法 搜索文本----词语索引使我们看到词的上下 text1.concordance("monstrous") 词出现在相似的上下文中 text1.similar(" ...
- 解决 Ubuntu 18.10 使用较新的独立显卡输出无法初始化图形界面并配置深度学习开发环境
原文地址:解决 Ubuntu 18.10 使用较新的独立显卡输出无法初始化图形界面并配置深度学习开发环境 0x00 配置 硬件 OS: Ubuntu 18.10 Base Board: ASUS WS ...
- ListView 如何提高其效率?
① 复用 ConvertView② 自定义静态类 ViewHolder③ 使用分页加载 ④ 使用 WeakRefrence 引用 ImageView 对象 ViewHolder 为什么要声明为静态类? ...