HJ141 小红的二叉树
- 题目
- 题解(28)
- 讨论(17)
- 排行
中等 通过率:31.35% 时间限制:1秒 空间限制:1024M
知识点数论

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
描述
小红想知道,深度为 nn 的++满二叉树++ [1][1]有多少条长度为 22 的++简单路径++ [2][2]?由于答案可能很大,请将答案对 (109+7)(109+7) 取模后输出。
在本题中,两条简单路径所包含的点集不同时,被视为不同的。例如,路径 u−vu−v 与路径 v−uv−u 被视为相同的,因为它们均包含点 uu 与点 vv。
一棵深度为 hh 的++满二叉树++ [1][1]由恰好 2h−12h−1 个节点组成,每一个节点要么是叶子节点,要么有 22 个儿子,并且全部叶子节点的深度均为 hh。
++简单路径++[2][2]是指这样一条路径,其经过的顶点和边互不相同。
输入描述:
在一行上输入一个正整数 n(1≦n≦104)n(1≦n≦104) 代表满二叉树的深度。
输出描述:
输出一个整数,代表深度为 nn 的满二叉树中,长度为 22 的简单路径的数量。由于答案可能很大,请将答案对 (109+7)(109+7) 取模后输出。
示例1
输入:
1
复制输出:
0
复制说明:
在这个样例中,深度为 11 的满二叉树只有 11 个节点,所以没有长度为 22 的简单路径。
示例2
输入:
3
复制输出:
7
复制说明:
在这个样例中,所给出的满二叉树如下图所示:

cpp
// 从深度为2开始,当前叶子节点为2个。每加一层,每个叶子节点会增加三条路径
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int n;
int main(){
cin>>n;
if(n==1) cout<<0;
else if(n==2) cout<<1;
else{
long long yezi=2,ans=1;
for(int i=3;i<=n;i++){
ans=(ans+yezi*3)%mod;
yezi=(yezi*2)%mod;
}
cout<<ans%mod;
}
return 0;
}