【CSP-S膜你考】最近公共祖先 (数学)
Problem A. 最近公共祖先 (commonants.c/cpp/pas)
注意
Input file: commonants.in
Output file: commonants.out
Time Limit : 0.5 seconds
Memory Limit: 512 megabytes
题面
最近公共祖先\(\text{(Lowest Common Ancestor,LCA)}\)是指在一个树中同时拥有给定的两个点作为后
代的最深的节点。
为了学习最近公共祖先,你得到了一个层数为\(n+1\)的满二叉树,其中根节点的深度为\(0\),其他节点的深度为父节点的深度\(+1\)。你需要求出二叉树上所有点对 \(\texttt{(i,j)}\),(\(i\),\(j\)可以相等,也可以\(i > j\))的最近公共祖先的深度之和对\(10^9+7\)取模后的结果。
输入格式
一行一个整数\(n\)。
输出格式
一行一个整数表示所有点对 \(\texttt{(i,j)}\),(\(i\),\(j\)可以相等,也可以\(i > j\))的最近公共祖先的深度之和对\(10^9+7\)取模后的结果。
样例
\(\texttt{input\#1}\)
2
\(\texttt{input\#2}\)
19260817
\(\texttt{output\#1}\)
22
\(\texttt{output\#2}\)
108973412
数据范围与提示
样例\(1\)解释:
树一共有\(7\)个节点(一个根节点和两个子节点),其中 \(\texttt{(4,4),(5,5),(6,6),(7,7)}\) 共\(4\)对的最近公共祖先深度为\(2\),\(\texttt{(4,2),(2,4),(5,2),(2,5),(5,4),(4,5),(2,2),(6,3),(3,6),(3,7),(7,3),(6,7),}\)\(\texttt{(7,6),(3,3)}\)共\(14\)对最近公共祖先深度是\(1\),其他的点对最近公共祖先深度为\(0\),所以答案为\(22\)。
对于\(20%\)的数据,\(n \le 10\)。
对于\(50%\)的数据,\(n \le 10^6\) 。
对于\(100%\)的数据,\(1 \le n \le 10^9\) 。
题解
对于一颗有\(n\)层的满二叉树很显然符合以下几点
1.第\(i\)层的点的个数为\(2^i\)。
2.以第\(i\)层的点为根节点的子树大小为\(2^{n-i+1}-1\)。
3.以第\(i\)层的点为\(\text{LCA}\)的点对个数为\(2^{2n-i+1}-2^i\)
观察上面的图(好丑),很明显\(1,2\)都是对的。
对于一颗以第\(i\)层的节点为根的子树:
①它的左子树与右子树上的点的\(\text{LCA}\)都为根节点。所以点对个数为
\]
\]
\]
②这棵子树的左子树与根节点的\(\text{LCA}\)都为根节点。右子树也是。所以有\(2^{n-i+1}-2\)对点。
③根节点与根节点的\(\text{LCA}\)也是根节点,点对个数为1。
点对\(\texttt{(u,v)}\)与点对\(\texttt{(v,u)}\)在\(u \neq v\)时是两个不同的点对。
所以将上述①②相加乘二再加③就是以子树根节点为\(\text{LCA}\)的点对的数量为:
\]
因为第\(i\)层的点的个数为\(2^i\)。所以以第\(i\)层的点为\(\text{LCA}\)的点对个数为:
\]
因为一共有\(n+1\)层,从\(0-n\)层,所以答案为:
\]
\]
但这样复杂度为\(\Theta (nlog_n)\)过不了。。将上面的式子展开:
\]
\]
\]
\]
\]
\]
很明显前\(n\)项为等比数列,利用等比数列求和公式可以很快求出。
\]
\]
\]
\]
很明显也是等比数列。将这两个相加就是答案了。
快速幂是\(log\)。所以复杂度是\(\Theta(log_n)\)
\(Code\)
#include<bits/stdc++.h>
typedef long long ll;
ll n;
const ll mod=1000000007;
inline void read(ll &T) {
ll x=0;bool f=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
T=f?-x:x;
}
inline ll qpow(ll a,ll b) {
ll ans=1,base=a;
while(b) {
if(b&1) ans=(ans*base)%mod;
base=(base*base)%mod;
b>>=1;
}
return ans%mod;
}
int main() {
read(n);
ll qwq=(((2*qpow(2,2*n+1))%mod-qpow(2,n+2)+5*mod)%mod-n*qpow(2,n+1)+5*mod)%mod;
ll qaq=((((2*qpow(2,n))%mod)-2+5*mod)%mod-n*qpow(2,n+1)+5*mod)%mod;
//std::cout<<qwq<<'\n'<<qaq<<'\n';
std::cout<<(qwq+qaq+5*mod)%mod;//加上一个模数再取模是为了处理负数的情况
return 0;
}
【CSP-S膜你考】最近公共祖先 (数学)的更多相关文章
- 【CSP-S膜你考】即时战略(模拟)
Problem B. 即时战略 (rts.c/cpp/pas) 注意 Input file: rts.in Output file: rts.out Time Limit : 2 seconds Me ...
- 8.3考试总结(NOIP模拟19)[最长不下降子序列·完全背包问题·最近公共祖先]
一定要保护自己的梦想,即使牺牲一切. 前言 把人给考没了... 看出来 T1 是一个周期性的东西了,先是打了一个暴力,想着打完 T2 T3 暴力就回来打.. 然后,就看着 T2 上头了,后来发现是看错 ...
- poj 1330 Nearest Common Ancestors(LCA:最近公共祖先)
多校第七场考了一道lca,那么就挑一道水题学习一下吧= = 最简单暴力的方法:建好树后,输入询问的点u,v,先把u全部的祖先标记掉,然后沿着v->rt(根)的顺序检查,第一个被u标记的点即为u, ...
- Solution: 最近公共祖先·一 [hiho一下 第十三周]
题目1 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中 ...
- 「LuoguP3379」 【模板】最近公共祖先(LCA)
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- [知识点]最近公共祖先LCA
UPDATE(20180822):重写部分代码. 1.前言 最近公共祖先(LCA),作为树上问题,应用非常广泛,而求解的方式也非常多,复杂度各有不同,这里对几种常用的方法汇一下总. 2.基本概念和暴力 ...
- LCA最近公共祖先 ST+RMQ在线算法
对于一类题目,是一棵树或者森林,有多次查询,求2点间的距离,可以用LCA来解决. 这一类的问题有2中解决方法.第一种就是tarjan的离线算法,还有一中是基于ST算法的在线算法.复杂度都是O( ...
- 【转】最近公共祖先(LCA)
基本概念 LCA:树上的最近公共祖先,对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. RMQ:区间最小值查询问题.对于长度为n的 ...
- 【并查集】【树】最近公共祖先LCA-Tarjan算法
最近公共祖先LCA 双链BT 如果每个结点都有一个指针指向它的父结点,于是我们可以从任何一个结点出发,得到一个到达树根结点的单向链表.因此这个问题转换为两个单向链表的第一个公共结点(先分别遍历两个链表 ...
随机推荐
- laravel hash密码生成和密码验证
在laravel中 登录表单中的密码是用hash来生成的. 在生成密码需要用到 laravel框架中的方法(都是laravel封装好了的) bcrypt($password)方法,直接将获取到的pas ...
- .net HttpClient 回传实体帮助类
public class HttpClientHelper<T> { /// <summary> /// Get请求 返回实体 /// </summary> /// ...
- Spring项目中的数据库加密
有时候为了安全,我们需要对数据库密码进行加密: SpringDruid数据源加密数据库密码 当我们初步开始打造系统时,什么都没有一片空白,而数据源使用的是SpringDruid时,我们可以通过这篇博客 ...
- Java 流程控制 之 分支结构——条件判断语句
一.判断语句 1.判断语句1-- 单 if 语句(单分支结构) 语法格式: if(条件表达式){ 语句体; } 执行流程: 首先判断条件表达式看其结果是 true 还是 false: 如果是 tru ...
- Java 面向对象—杂项(方法不能重写,修饰符,变量)
一.哪些方法不能被重写? 1.final 修饰的不能重写 2.static 修饰的不能重写 3.private 修饰的,因为私有的在子类中不可见 4.如果跨包的话,修饰符缺省的也不能被重写,因为缺省的 ...
- MES系统帮助冷轧厂实现次品的流程解析
为了解决现场实际生产过程中纸质不良品卡片易丢失.周期长.传递缓慢,不能起到质量警示和生产预警等诸多方面的问题,某冷轧厂采取了在MES系统中实现不良品业务流程的方案,完全替代和取消了纸质不良品卡片,在M ...
- 面试题:什么叫2B树
在B树的基础上,每个节点有两个域,且他们是有顺序的,在层次上的又满足二叉排序树的性质
- PHP实现单人多人聊天源码免费分享 | 电脑报修系统
源码清单 1. 简易版登陆式聊天源码. 2. 电脑报修轻系统源码. 3. 关注下面公众号回复“聊天”,免费获取. 聊天系统 虽然微信,QQ是即时通讯的元老.但是他们限制很多,所以很多人都想做一个自己的 ...
- 浅谈Python设计模式 - 原型模式
声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...
- httprunner学习7-extract提取content返回对象
前言 提取response返回的对象数据,用extract关键字.前面有关于token的取值,通过content.token取值. 本篇详细讲解如何从返回的json数据提取出想要的各种数据 conte ...