题目大意
n层的满k叉树T,求对于每一对(i,j)(1≤i,j≤T的点数),LCA(T,i,j)的深度的和是多少。这个数字n层的满k叉树指一棵带标号的有根树,深度为i(0≤i
解题思路
显然得出ans=∑n−1i=1i∗ki∗(((kn−i−1)/(k−1))2−k∗((kn−i−1−1)/(k−1))2)
化简得ans=(k2n−kn+1+kn−k)/(k−1)3−(2n−2)∗kn/(k−1)2
具体化简方法不多说,大概思路是使用等比数列求和,以及错位相消法。
code
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;
}