题意: 一颗N层完全二叉树,求有多少对点(i,j) 最短距离为D 定义(i,j) (j,i)为不同的方案
分析:我们考虑对每一个节点算贡献,假设在第i层,距离底层还有n-i 的高度 我们定义为h
如果d<=h 那么第i层的所有节点都可以挂一个d层二叉子树,构成方案,即2d *2i-1 第i层的所有节点
还有一种方法对于当前第i层,我们往它在下放一层,考虑左右子树,那么有一个最大高度R为min(h,d-1) 同理最低高度 L为 d-r 若L<R 那么可以考虑左右子树都挂上,那么方案就是(R-L+1)*2 * 2R-1 *2L-1
左右悬挂距离求和为d-2 再乘上当前层的所有节点数,
ll mi[2111100];
signed main(){
ll n;
read(n);
mi[0]=1;
for(int i=1;i<=n*2;i++){
mi[i]=(mi[i-1]*2)%modd;
}
ll d;
read(d);
ll ans=0;
for(int i=1;i<=n;i++){
ll now=n-i;
if(d<=now){
ans=(ans+mi[d]%modd*mi[i-1]%modd)%modd;
}
ll r=min(now,d-1);
ll l=d-r;
if(l>r)continue;
ans=(ans+(r-l+1)%modd*mi[d-2]%modd*mi[i-1]%modd)%modd;
}
printf("%lld\n",ans*2%modd);
}