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

CF750G New Year and Binary Tree Paths

  • description
  • solution
  • code

description

题目链接

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

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

s≤1e15s\le 1e15s1e15

solution

  • 一条单链的情况

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

    假设从上往下一直往左子树走【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)xxi=0h12i=(2h1)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-1j=0i12j=2i1贡献

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

    证明:假设取x−1x-1x1,且这条长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(2h1)(x1)+i=1h1(2i1)=2hxx2h+1+2h1h=(2h1)xh<(2h1)x

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

    这里同样经典的,可以判断能否用【1,3,...,2h−1−11,3,...,2^{h-1}-11,3,...,2h11】构造出s−(2h−1)xs-(2^h-1)xs(2h1)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(2h11)+(2x+1)(2h21)=(2h1+1+2h2+13)x+2h21

    同理,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}\rfloor2h1+1+2h2+13s(2h21)

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

    同时,考虑怎么用各自某一层走右儿子产生的贡献【1,3,...,2h1−1;1,3,...,2h2−11,3,...,2^{h_1}-1;1,3,...,2^{h_2}-11,3,...,2h11;1,3,...,2h21】来构造出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

    • 这里的实现考虑使用数位dpdpdpO(h1h2)O(h_1h_2)O(h1h2)求出结果

      fi,j,k:f_{i,j,k}:fi,j,k:iiih1h_1h1h2h_2h2两条链的状态一共选了jjj222的次方【可能选了222^2222i−1...2^{i-1}...2i1...,反正一共选了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+k2it+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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eShopOnContainers 知多少[9]:Ocelot gateways

引言客户端与微服务的通信问题永远是一个绕不开的问题&#xff0c;对于小型微服务应用&#xff0c;客户端与微服务可以使用直连的方式进行通信&#xff0c;但对于对于大型的微服务应用我们将不得不面对以下问题&#xff1a;如何降低客户端到后台的请求数量&#xff0c;并减少与…

Acwing 1072. 树的最长路径

Acwing 1072. 树的最长路径 题意&#xff1a; 每个边有权值&#xff0c;求树的直径 题解&#xff1a; 两遍dfs可以求&#xff0c;这里用树形dp的方法&#xff0c;我们将1作为根节点来看这棵树 我们可以将点看作是钉子&#xff0c;边就是挂在钉子上的绳子&#xff0c;我们只…

模板:矩阵树定理

文章目录前言解析无向图有向图根向树叶向树code带权图code所谓矩阵树定理&#xff0c;就是用矩阵解决树问题的定理。 &#xff08;逃&#xff09; 前言 神奇科技。 之前一直没有写博客&#xff0c;觉得还是写一发比较好。 证明什么的是不可能会的 背下来背下来&#xff01; …

P2016 战略游戏

P2016 战略游戏 题意&#xff1a; 他要建立一个古城堡&#xff0c;城堡中的路形成一棵无根树。他要在这棵树的结点上放置最少数目的士兵&#xff0c;使得这些士兵能了望到所有的路。 注意&#xff0c;某个士兵在一个结点上时&#xff0c;与该结点相连的所有边将都可以被了望…

.NET/C# 获取一个正在运行的进程的命令行参数

在自己的进程内部&#xff0c;我们可以通过 Main 函数传入的参数&#xff0c;也可以通过 Environment.GetCommandLineArgs 来获取命令行参数。但是&#xff0c;可以通过什么方式来获取另一个运行着的程序的命令行参数呢&#xff1f;进程内部获取传入参数的方法&#xff0c;可以…

CF896E Welcome home,Chtholly/[Ynoi2018]五彩斑斓的世界(并查集+第二分块)

CF896E Welcome home,Chtholly/[Ynoi2018]五彩斑斓的世界descriptionsolutioncodedescription 五彩斑斓的世界 CF896E Welcome home,Chtholly 五彩斑斓的世界是加强版&#xff0c;所以下面的题解部分是写的加强版 solution 第二分块 查询操作中把>x>x>x的数全都…

Defuse the Bombs Gym - 102822D

Defuse the Bombs Gym - 102822D 题目&#xff1a; 给你n个数&#xff0c;现在每轮会有三个操作&#xff1a; 1.选择一个数&#xff0c;使他加一 2.所有数减一 3.当有一个数变成负数时结束操作&#xff0c;否则回到第一步 问最多能进行几次第一步&#xff1f; 题解&#xff…

P4364 [九省联考 2018] IIIDX(线段树、贪心)

解析 感觉不至于黑的题。 然而我并不会做 did_idi​ 互不相同的时候直接无脑贪心即可&#xff0c;这样55分的好成绩就到手了。&#xff08;交完发现可以骗到60&#xff09; 滚榜级的良心分了属于是。 考虑有相同时如何做。 先把值降序排序&#xff0c;然后维护一棵线段树&…

CF1491H Yuezheng Ling and Dynamic Tree(分块)

CF1491H Yuezheng Ling and Dynamic Treedescriptionsolutioncodedescription 题目链接 solution 非常清新的小分块题了 前提&#xff1a;将序列分成n\sqrt{n}n​块&#xff0c;每块有n\sqrt{n}n​个数&#xff0c;记第iii个块的左右边界为Li,RiL_i,R_iLi​,Ri​&#xff0…

听说,霸都.NET技术社区准备搞线下聚会了?

.NET Core实战项目交流群日常交流嗨&#xff0c;你听说了没有&#xff1f;霸都.NET技术社区准备搞线下聚会了&#xff01;啥时候的事情啊&#xff1f;最近才知道的消息啊&#xff01;那你是从哪里知道的消息呢&#xff1f;.NET Core项目实战交流群&#xff08;637326624&#x…

Knowledge is Power Gym - 102822K

Knowledge is Power Gym - 102822K 题意&#xff1a; 给你一个数n&#xff0c;让你将n分解成一些互质的数&#xff0c;然后这些数的最大值减最小值要求最小&#xff0c;如果不行输出-1&#xff0c;否则输出最大值减最小值的最小情况 题解&#xff1a; 具体做法是通过枚举大…

P4383 [八省联考 2018] 林克卡特树(wqs二分、树形dp)

解析 它还真的不难。 乐。 这题没做出来有些谔谔。 外层wqs二分显而易见&#xff0c;里面不知道为啥我总觉得这个题可以贪心。 然后一直试图在原树直径上下功夫&#xff0c;一筹莫展。 看到题解“dp”两个字这题也就做完了… 就相当于要把一棵树分成若干条无交链&#xff0c;每…

ASP.NET Core中实现单体程序的事件发布/订阅 - LamondLu - 博客园

标题&#xff1a;ASP.NET Core中实现单体程序的事件发布/订阅作者&#xff1a;Lamond Lu地址&#xff1a;https://www.cnblogs.com/lwqlun/p/10468058.html项目源代码&#xff1a;https://github.com/lamondlu/EventHandlerInSingleApplication背景事件发布/订阅是一种非常强大…

CF1592E Bored Bakry(二进制+前缀异或和)

CF1592E Bored Bakrydescriptionsolutioncodedescription 题目链接 solution and\text{and}and如果第iii位为111&#xff0c;意味着区间内每个数的第iii位都是111 xor\text{xor}xor如果第iii位为111&#xff0c;意味着区间内有奇数个第iii位为111 这种涉及二进制操作的一般都…

Joy of Handcraft Gym - 102822J(线段树或差分)

Joy of Handcraft Gym - 102822J 题意&#xff1a; 每个灯有亮的周期和亮度&#xff0c;问1~m这段时间灯光最亮是多少 题解&#xff1a; 线段树维护区间最大值 根据灯的周期向这段区间加亮度k&#xff0c;然后利用线段树维护区间最大值 但是这样会超时&#xff0c;加个小优…

.NET Core 使用 HttpClient SSL 请求出错的解决办法

问题使用 HTTP Client 请求 HTTPS 的 API 时出现 The certificate cannot be verified up to a trusted certification authority 异常&#xff0c;并且证书已经传入。下面就是问题代码&#xff1a;public class Program{public static void Main(string[] args){var url &quo…

CF1580C Train Maintenance(分块)

CF1580C Train Maintenancedescriptionsolutioncodedescription 题目链接 solution 这是一种利用根号平衡时间复杂度的套路 分α\alphaα【操作参数】与n\sqrt{n}n​的关系&#xff0c;一半采取暴力&#xff0c;一半利用工具特殊处理 对于本题&#xff0c;假设第iii辆车的加…

P3746 [六省联考 2017] 组合数问题(倍增、dp)

解析 再次被“组合数问题”吊打qwq 和上一次不一样的是&#xff0c;这次更加被恶心到了。 一方面受上一个组合数问题影响&#xff0c;另外出题人也十分阴间&#xff0c;一开始还给了个组合数的公式&#xff0c;更加使我坚定的认为这是一道数学推柿子题。 然后就开始各种打表玩…

CF1473E Minimum Path(拆点+最短路)

CF1473E Minimum Pathdescriptionsolutioncodedescription 题目链接 solution 看到 ∑i1kwei\sum_{i1}^kw_{e_i}∑i1k​wei​​ 的式子&#xff0c;就应该联想到最短路 先考虑题目的弱化版&#xff0c;去掉 max,min\text{max},\text{min}max,min 的限制&#xff0c;变成一条…

2020CCPC绵阳

2020CCPC绵阳 题号题目名难度知识点AA Colorful GridBBuilding BlocksCCode a TrieDDefuse the Bombs签到二分EEscape from the IslandFFracture RayGGame of Cards银牌博弈论&#xff0c;SG函数HHide and SeekIInvaluable AssetsJJoy of Handcraft快铜线段树KKnowledge is Po…