【jzoj4888】【最近公共祖先】

题目大意

n层的满k叉树T,求对于每一对(i,j)(1≤i,j≤T的点数),LCA(T,i,j)的深度的和是多少。这个数字n层的满k叉树指一棵带标号的有根树,深度为i(0≤i

解题思路

显然得出ans=n1i=1iki(((kni1)/(k1))2k((kni11)/(k1))2)
化简得ans=(k2nkn+1+knk)/(k1)3(2n2)kn/(k1)2
具体化简方法不多说,大概思路是使用等比数列求和,以及错位相消法。

code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define min(a,b) ((a<b)?a:b)
#define max(a,b) ((a>b)?a:b)
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
LL const mod=998244353;
LL n,k;
LL Pow(LL x,LL y){
    LL z=1;
    for(;y;){
        if(y%2)z=(z*x)%mod;
        x=(x*x)%mod;
        y/=2;
    }
    return z;
}
int main(){
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);
    scanf("%lld%lld",&n,&k);
    printf("%lld",((((Pow(k,2*n)-Pow(k,n+1)+Pow(k,n)-k)%mod+mod)%mod*Pow(k-1,mod-2)%mod-(2*n-2)*Pow(k,n)%mod)%mod+mod)%mod*Pow(k-1,mod-2)%mod*Pow(k-1,mod-2)%mod);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值