与一个精灵手拉着手,|
2021-03-07 20:23阅读: 140评论: 0推荐: 4

参天大树[题解]

参天大树

题目大意

给出一个 n 层的满二叉树,其根节点编号为 1 ,对于每一个 x(x1) ,编号为 x 的节点有编号为 2x 与编号为 2x+1 的子节点。

需要从该二叉树的节点中选出一些节点(可以相同),求出所有情况中他们 LCA 的和。

则我们需要求出下面这个式子的值:

i=1i<=nj=1j<=nLCA(i,j)

最终答案对 998244343 取模。

分析

拿到这个题,我们可以换一个角度来思考,不妨想一想如果我们想要选出节点的 LCAi 节点,有多少种不同的情况。

其实我们可以分为以下三种情况:

  • 这两个点就是 xx ,这样就能保证有 x 的贡献,很显然该情况只会出现一次。

  • 这两个点分别在 x 的左子树与右子树,如上图,这样也能保证他们的 LCA 恰为 x ,则这种情况的总数肯定就是左子树的大小乘右子树的大小还要乘 2 ,注意这里的乘 2 是因为除了选择同一个点的情况其余情况都可以反转。

  • 固定其中一个点为 x ,剩余的点在 x 的子树中选取,则很显然情况数位 2x 所有后代的数量。

那么,我们就能处理出 xLCA 时的所有贡献了。

sumsunx 一个子树的大小,设根节点的层数为 1x 的层数为 i ,则易有 sumsun=2ni1

则当前的可知道 LCAx 的贡献为:

sumx=x×[1+2×(2n11)×(2n11)+2×2×(2n11)]

进行化简即为

sumx=x×[1+2×(2n11)×(2n1+1)]=x×[1+2×(22(ni)1)]

接下来考虑如何将其转化到层上去,我们发现,其实每层的节点他们的子树都是一模一样的,所不同的只是系数,我们设 sumi 表示第 i 层所有节点编号值的和,则有:

ans=i=1i<=nsumi×[1+2×(22(ni)1)]

numli 表示第 i 层最左边节点的编号, numri 表示第 i 层最右边节点的编号,则有:

numli=2i1,numri=numli+2i11

sumi=(numli+numri)×2i12=3×22(i1)2i12

ans=i=1i<=n3×22(i1)2i12+(3×22(i1)2i1)(22(n1)1)=i=1i<=n(3×22(i1)2i1)(22(n1)12)

展开即为

ans=i=1i<=n3×22(n1)22ni1+12×2i132×22(i1)

然后再展开

ans=3n×22(n1)+12×i=1i<=n2i132×i=1i<=n22(i1)22ni=1i<=n12i+1

然后,又有

i=1i<=n2i1=2n1

后面的两个求和式用到等比数列求和的知识,即

i=1i<=n22(i1)=122n122=22n13

i=1i<=n12i+1=14×(1(12)n)112

最后得到的答案为:

ans=3n×22n2+2n22n

然后就做完了。

更新:此题根本不用快速幂,可以通过直接 O(n) 的预处理避免超时,下面是最新代码。

CODE

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10,MOD=998244353;
inline ll read()
{
    ll s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*w;
}
ll dis[N];
int main()
{
	ll t=read();
	dis[0]=1;
	for(register int i=1;i<=1e6;i++) dis[i]=dis[i-1]*2%MOD;
	while(t--){
		ll n=read(),temp=dis[n-1];
		ll ans=((3*n%MOD-4+MOD)%MOD*temp%MOD*temp%MOD+temp*2%MOD+MOD)%MOD;
		printf("%lld\n",ans);
	}
	return 0;
}

本文作者:╰⋛⋋⊱๑落叶๑⊰⋌⋚╯

本文链接:https://www.cnblogs.com/Defoliation-ldlh/p/14496177.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   ╰⋛⋋⊱๑落叶๑⊰⋌⋚╯  阅读(140)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起