AtCoder Beginner Contest 220 Distance on Large Perfect Binary Tree(思维)

在这里插入图片描述
题意: 一颗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);
 
 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值