【NOIP2016提高A组集训第14场11.12】最近公共祖先
2016-11-12 19:10
288 查看
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≤iSolution
这道题一看到就开始推O(n)怎么做。考虑点对的lca贡献为i的点对数=ki∗(size[n−i+1]2−k∗size[n−i]2),因为这层一共有ki个节点,然后单个节点的里面所有节点先两两匹配,然后还要减去他们k个儿子额两两匹配。
然后答案=∑n−1i=0i∗ki∗(size[n−i+1]2−k∗size[n−i]2)
因为size是节点个数,可以用等比数列来求出来:size[i]=1+k+k2+......+ki=ki+1−1k−1
那么带入上面的式子就可以变成∑n−1i=0i∗(k2n−i+1−ki)k−1
然后答案=1k−1∗(∑n−1i=0i∗k2n−i+1−∑n−1i=0i∗ki)
=1k−1∗(k2n+1∗∑n−1i=0i∑n−1i=0i∗ki−∑n−1i=0i∗ki)
现在我们的主要问题就是∑n−1i=0i∗ki=??????
我们的目的只是要把i和ki分离出来。
那么考虑给每个ki都补上一个系数n,那么上式就变成n∗∑n−1i=0ki−∑ni=1∑i−1j=0kj
那么把这个代入上式,那么答案就变成:
1k−1∗(k2n+1∗(n−1)∗nn∗∑n−1i=0ki−∑ni=1∑i−1j=0kj−n∗∑n−1i=0ki+∑ni=1∑i−1j=0kj
然后再把等比数列求和套进去:
答案就可以化简成:
k2n−k−(2n−1)kn(k−1)(k−1)3
Code
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define fo(i,a,b) for(i=a;i<=b;i++) #define fod(i,a,b) for(i=a;i>=b;i--) using namespace std; typedef long long ll; const ll maxn=1000007,mo=998244353; ll i,j,k,l,t,n,m,ans,yi,er; ll ci[maxn],size[maxn]; ll qsm(ll x,ll y){ ll z=1; for(;y;y/=2,x=x*x%mo)if(y&1)z=z*x%mo; return z; } int main(){ freopen("lca.in","r",stdin); freopen("lca.out","w",stdout); scanf("%lld%lld",&n,&k); ans=(qsm(k,2*n)-k-(2*n-1)*qsm(k,n)%mo*(k-1)%mo)%mo; ans=(ans+mo)%mo; t=qsm(k-1,3); ans=ans*qsm(t,mo-2)%mo; printf("%lld\n",ans); }
相关文章推荐
- JZOJ4888【NOIP2016提高A组集训第14场11.12】最近公共祖先
- 【JZOJ4888】【NOIP2016提高A组集训第14场11.12】最近公共祖先
- 4888. 【NOIP2016提高A组集训第14场11.12】最近公共祖先 (2017.10B组)
- 最近公共祖先 【NOIP2016提高A组集训第14场11.12】
- JZOJ 4888 【NOIP2016提高A组集训第14场11.12】最近公共祖先
- 【NOIP2016提高A组集训第14场11.12】最近公共祖先
- 【JZOJ4889】【NOIP2016提高A组集训第14场11.12】最长公共回文子序列
- 【NOIP2016提高A组集训第14场11.12】最长公共回文子序列
- 【NOIP2016提高A组集训第14场11.12】随机游走
- 【NOIP2016提高A组集训第14场11.12】随机游走——期望+树形DP
- JZOJ4890. 【NOIP2016提高A组集训第14场11.12】随机游走
- 【NOIP2016提高A组集训第14场11.12】随机游走
- 最长公共回文子序列 【NOIP2016提高A组集训第14场11.12】
- 【NOIP2016提高A组集训第14场11.12】随机游走
- 【JZOJ4890】【NOIP2016提高A组集训第14场11.12】随机游走
- 4890. 【NOIP2016提高A组集训第14场11.12】随机游走 (2017.10B组)
- 【NOIP提高组】最近公共祖先
- 【NOIP2016提高A组集训第9场11.7】Simple
- JZOJ4899. 【NOIP2016提高A组集训第17场11.16】雪之国度
- 【JZOJ4869】【NOIP2016提高A组集训第9场11.7】平均数