P4427 [BJOI2018]求和


同[TJOI2018]教科书般的扭曲虚空

懒得写了(雾

#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
#define mod 998244353
int fir[300010],dis[600010],nxt[600010],id,dep[300010];
int st[19][300010];
il vd link(int a,int b){nxt[++id]=fir[a],fir[a]=id,dis[id]=b;}
ll C[101][101],B[51][101],inv[101];
il ll pow(ll x,ll y){
ll ret=1;
while(y){
if(y&1)ret=ret*x%mod;
x=x*x%mod;y>>=1;
}
return ret;
}
il ll calc(ll k,ll n){
if(n<0)return 0;
ll ret=0;
for(int i=1;i<=k+1;++i)ret+=C[k+1][i]*B[k][k+1-i]%mod*pow((n+1)%mod,i)%mod;
return ret%mod*inv[k+1]%mod;
}
il vd dfs(int x,int fa=-1){
for(int i=fir[x];i;i=nxt[i]){
if(dis[i]==fa)continue;
dep[dis[i]]=dep[x]+1;
st[0][dis[i]]=x;
dfs(dis[i],x);
}
}
il int LCA(int a,int b){
if(dep[a]<dep[b])std::swap(a,b);
int c=dep[a]-dep[b];
for(int i=18;~i;--i)if(c&(1<<i))a=st[i][a];
for(int i=18;~i;--i)if(st[i][a]^st[i][b])a=st[i][a],b=st[i][b];
if(a^b)a=st[0][a];
return a;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("4427.in","r",stdin);
freopen("4427.out","w",stdout);
#endif
int n=gi(),a,b;
for(int i=1;i<n;++i)a=gi(),b=gi(),link(a,b),link(b,a);
dfs(1);
C[0][0]=1;
for(int i=1;i<101;++i){
C[i][0]=1;
for(int j=1;j<=i;++j)C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
inv[1]=1;for(int i=2;i<101;++i)inv[i]=(mod-(mod/i)*inv[mod%i]%mod)%mod;
for(int k=1;k<51;++k){
B[k][0]=1;
for(int i=1;i<101;++i){
for(int j=0;j<i;++j)B[k][i]+=C[i+1][j]*B[k][j]%mod;
B[k][i]=(mod-B[k][i]%mod*inv[i+1]%mod)%mod;
}
}
for(int i=1;i<19;++i)
for(int j=1;j<=n;++j)
st[i][j]=st[i-1][st[i-1][j]];
int m=gi(),c,k;
while(m--){
b=gi(),c=gi(),a=LCA(b,c),k=gi();
printf("%lld\n",(calc(k,dep[b])+calc(k,dep[c])-calc(k,dep[a])-calc(k,dep[a]-1)+mod+mod)%mod);
}
return 0;
}

P4427 [BJOI2018]求和的更多相关文章

  1. Luogu P4427 [BJOI2018]求和

    这是一道巨狗题,我已无力吐槽为什么我怎么写都不过 我们对于这种无修改的边权题目有一个经典的树上差分套路: \(ans=sum_x+sum_y-2\cdot sum_{LCA(x,y)}\) 这里的\( ...

  2. 洛谷P4427 [BJOI2018]求和

    \(\Large\textbf{Description: } \large{一颗n个节点的树,m次询问,每次查询点i到点j的路径上所有节点点深度的k次方的和并对998244353取模(1\leq n, ...

  3. 【BZOJ5293】[BJOI2018]求和(前缀和,LCA)

    [BZOJ5293][BJOI2018]求和(前缀和,LCA) 题面 BZOJ 洛谷 题解 送分题??? 预处理一下\(k\)次方的前缀和. 然后求个\(LCA\)就做完了?... #include& ...

  4. bzoj5293: [Bjoi2018]求和

    题目链接 bzoj5293: [Bjoi2018]求和 题解 暴力 对于lca为1的好坑啊.... 代码 #include<cmath> #include<cstdio> #i ...

  5. LCA+差分【p4427】[BJOI2018]求和

    Description master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的\(k\) 次方和,而且每次的\(k\) 可能是不同的.此处节点深度的 ...

  6. BZOJ5293: [Bjoi2018]求和 树上差分

    Description master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的k  次方和,而且每次的k 可能是不同的.此处节点深度的定义是这个节点 ...

  7. 【刷题】BZOJ 5293 [Bjoi2018]求和

    Description master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的k 次方和,而且每次的k 可能是不同的.此处节点深度的定义是这个节点到 ...

  8. BZOJ5293:[BJOI2018]求和(LCA,差分)

    Description master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的k  次方和,而且每次的k 可能是不同的.此处节点深度的定义是这个节点 ...

  9. [BJOI2018]求和(树链剖分)

    题目描述 master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的 kkk 次方和,而且每次的 kkk 可能是不同的.此处节点深度的定义是这个节点到根 ...

随机推荐

  1. Flask 参数简介

    我们都知道学习了Flask的时候它里面的参数是有很多种的参数  都是需要相互进行调用传递的  今天就简要分析一些常见的参数 首先导入Flask之后看 源码 from flask import Flas ...

  2. eclipse中 项目-->属性-->为什么没有deployment assembly 选项

    原因: 因为当前的maven工程不是web工程,需要转换成web工程. 解决方法: 右击工程属性,找到Project Facets,选择Dynamic Web Module,2.5 点击apply.这 ...

  3. 在C中调用Matlab (转)

    http://blog.163.com/rongting_chen/blog/static/164906844201252354518462/ http://www.ilovematlab.cn/th ...

  4. zabbix图形插件:Graphtree

    目的:为了达图形聚合 参考博文:https://blog.csdn.net/mysunshineto/article/details/80242754 Graphtree由OneOaaS开发并开源出来 ...

  5. September 27th 2017 Week 39th Wednesday

    We both look up at the same stars, yet we see such different things. 我们仰望同一片星空,却看见了不同的事物. Looking up ...

  6. [2018HN省队集训D5T2] party

    [2018HN省队集训D5T2] party 题意 给定一棵 \(n\) 个点以 \(1\) 为根的有根树, 每个点有一个 \([1,m]\) 的权值. 有 \(q\) 个查询, 每次给定一个大小为 ...

  7. nodejs11安装教程(升级最新版本)

    nodejs需要不断升级,那么电脑如何安装nodejs11呢,下面将通过亲身实践来详细介绍   工具/原料   电脑 nodejs11安装包 方法/步骤     访问node11官网,下载安装包,如下 ...

  8. Javascript (ECMAScript5) 的细节和违反直觉的地方

    记录在学习Javascript (ECMAScript5) 中的一些与其他语言的不同之处,本文会不断更新. 里面的知识可能并不太适合有一定经验的Javascript程序员,仅仅但不限于给初学者阅读. ...

  9. C语言不使用加号实现加法运算的几种方法

    今天看到<编码:隐匿在计算机软硬件背后的语言>的第十二章:二进制加法器.讲述了全加器,半加器的原理以及如何实现加法.实现加法时所使用的全加器,半加器中包含的所有逻辑门在C语言中都有相应的运 ...

  10. C++——命名空间

    C++命名空间基本常识 所谓namespace,是指标识符的各种可见范围.C++标准程序库中的所有标识符都被定义于一个名为std的namespace中. 一 :<iostream>和< ...