【jzoj4888】【最近公共祖先】

来源:互联网 发布:网商贷淘宝信用贷款 编辑:程序博客网 时间:2024/06/08 10:16

题目大意

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;}
0 0
原创粉丝点击