4888. 【NOIP2016提高A组集训第14场11.12】最近公共祖先 (2017.10B组)

来源:互联网 发布:手机解锁密码软件 编辑:程序博客网 时间:2024/05/28 17:08

Description

YJC最近在学习树的有关知识。今天,他遇到了这么一个概念:最近公共祖先。对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。YJC很聪明,他很快就学会了如何求最近公共祖先。他现在想寻找最近公共祖先有什么性质,于是他提出了这样的一个问题:n层的满k叉树T,求对于每一对(i,j)(1≤i,j≤T的点数),LCA(T,i,j)的深度的和是多少。这个数字n层的满k叉树指一棵带标号的有根树,深度为i(0≤i<n)的点有k^i个,所有深度≠n-1的点都有k个孩子。YJC发现他不会做了,于是他来问你这个问题的答案。这个答案可能很大,你只需要告诉他答案%998244353的值就可以了。

Input

第一行包含两个整数n和k,表示T是一棵n层的满k叉树。

Output

一行,包含一个整数,表示问题的答案%998244353的值。

Sample Input

3 2

Sample Output

22

Data Constraint

​对于30%的数据,满足2≤n,k≤8;
对于50%的数据,满足2≤n,k≤1000000;
对于100%的数据,满足2≤n,k≤998244351。

Hint

LCA深度为0的点对有31个,深度为1的点对有14个,深度为2的点对有4个,所以答案=31*0+14*1+4*2=22。
想法:
lca深度为i的点对有(第i层的每个点的子树大小)^2-k*(第i+1层每个点的子树大小的平方)
ans=i*k^i*lca深度为i的点对
这个比较好理解,两两匹配,再用容斥原理去掉不是的
然后第i层的每个点的子树大小为1+k+k^2+....+k(n-i-1)
然后就手推式子了。。
阅读全文
0 0
原创粉丝点击