Description

master 对树上的求和非常感兴趣。他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的k
 次方和,而且每次的k 可能是不同的。此处节点深度的定义是这个节点到根的路径上的边数。他把这个问题交给
了pupil,但pupil 并不会这么复杂的操作,你能帮他解决吗?

Input

第一行包含一个正整数n ,表示树的节点数。
之后n-1 行每行两个空格隔开的正整数i,j ,表示树上的一条连接点i 和点j 的边。
之后一行一个正整数m ,表示询问的数量。
之后每行三个空格隔开的正整数i,j,k ,表示询问从点i 到点j 的路径上所有节点深度的k 次方和。
由于这个结果可能非常大,输出其对998244353 取模的结果。
树的节点从1 开始标号,其中1 号节点为树的根。

Output

对于每组数据输出一行一个正整数表示取模后的结果。
1≤n,m≤300000,1≤k≤50

Sample Input

5
1 2
1 3
2 4
2 5
2
1 4 5
5 4 45

Sample Output

33
503245989
说明
样例解释
以下用d(i) 表示第i 个节点的深度。
对于样例中的树,有d(1)=0,d(2)=1,d(3)=1,d(4)=2,d(5)=2。
因此第一个询问答案为(2^5 + 1^5 + 0^5) mod 998244353 = 33
第二个询问答案为(2^45 + 1^45 + 2^45) mod 998244353 = 503245989。

Solution

最近好没状态,感觉要钦定退役了
对于这个题,如果不考虑k次方的话就是裸的树上差分
然后发现k非常小,就可以把所有k次方的情况全部记录下来
全WA到取模和longlong上了……

Code

 #include<iostream>
#include<cstring>
#include<cstdio>
#define MOD (998244353)
#define N (300000+100)
using namespace std; struct node
{
int to,next;
}edge[N*];
int Father[N],a[N],Depth[N],f[N][],Sum[N][],Pow[N][];
int head[N],num_edge,n,m,x,y,k; void add(int u,int v)
{
edge[++num_edge].to=v;
edge[num_edge].next=head[u];
head[u]=num_edge;
} void Build(int x)
{
Depth[x]=Depth[Father[x]]+;
Sum[x][]=; Pow[x][]=;
for (int i=; i<=; ++i)
{
Pow[x][i]=((long long)Pow[x][i-]*(long long)Depth[x])%MOD;
Sum[x][i]=(Sum[Father[x]][i]+Pow[x][i])%MOD;
} for (int i=head[x]; i; i=edge[i].next)
if (edge[i].to!=Father[x])
{
Father[edge[i].to]=x;
f[edge[i].to][]=x;
Build(edge[i].to);
}
} int LCA(int x,int y)
{
int ans=;
if (Depth[x]<Depth[y]) swap(x,y);
for (int i=; i>=; --i)
if (Depth[f[x][i]]>=Depth[y])
x=f[x][i];
if (x==y) return x;
for (int i=; i>=; --i)
if (f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return Father[x];
} int main()
{
scanf("%d",&n);
for (int i=; i<=n-; ++i)
{
scanf("%d%d",&x,&y);
add(x,y); add(y,x);
}
Depth[]=-;
Build();
for (int i=; i<=; ++i)
for (int j=;j<=n;++j)
f[j][i]=f[f[j][i-]][i-];
scanf("%d",&m);
for (int i=; i<=m; ++i)
{
scanf("%d%d%d",&x,&y,&k);
int lca=LCA(x,y);
printf("%d\n",((Sum[x][k]+Sum[y][k]-Sum[Father[lca]][k]-Sum[lca][k])%MOD+MOD)%MOD);
}
}

BZOJ5293:[BJOI2018]求和(LCA,差分)的更多相关文章

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

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

  2. bzoj5293: [Bjoi2018]求和

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

  3. [BZOJ5293][BJOI2018]求和(倍增)

    裸的树上倍增. #include<cstdio> #include<cstring> #include<algorithm> #define rep(i,l,r) ...

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

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

  5. P4427 [BJOI2018]求和

    P4427 [BJOI2018]求和 同[TJOI2018]教科书般的扭曲虚空 懒得写了(雾 #include<bits/stdc++.h> #define il inline #defi ...

  6. NOIP2015 运输计划(二分+LCA+差分)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 308  Solved: 208[Submit][Status] ...

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

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

  8. Luogu4427 [BJOI2018]求和 (树上差分)

    预处理,树上差分.注意深度减一 #include <cstdio> #include <iostream> #include <cstring> #include ...

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

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

随机推荐

  1. 获取两个List中的不同元素,4种方法,逐步优化,学习使用

    完全复制https://www.cnblogs.com/czpblog/archive/2012/08/06/2625794.html 先上测试结果 代码 package com.syl.test; ...

  2. 使用在线工具下载YouTube视频

    YouTube上面有数不尽的视频资源,很多人都想从上面下载自己喜欢的视频,但是不得其法.那么,究竟怎样从YouTube上面下载视频呢?其实,一点也不难.只要你在Google上面搜索free youtu ...

  3. java 的底层通信--Socket

    以前一直不太重视java 基础的整理,感觉在实际开发中好像java 基础用处不大,感觉不理解一些底层的东西对开发工作影响也不大.不过,后来我发现,很多东西都是相互联系的,如果底层的东西你不理解,后面的 ...

  4. mac os下载安装jmeter

    一.简介 jmeter是属于apache的一个开源产品,纯Java应用.最初用来进行功能测试,而后又扩展了更多的测试功能. 二.下载 进入apache的jmeter下载页:http://jmeter. ...

  5. JUC总览,来自汪文君整理

  6. mysql 远程连接权限

    当你远程连不上时,可能的原因: 1.是否开启了远程连接权限 2.是否启动了mysql服务 使用客户端远程登陆报错: 使用命令行myslq -h192.168.82.23 -uroot -p123456 ...

  7. nexus3安装

    windows环境 1.下载nexus3 2.以管理员的方式打开命令行,建议打开服务管理界面,将这个服务设置为手动,步骤是:右键我的电脑-->服务-->nexus,然后点击设置手动启动 3 ...

  8. AMD 规范与CMD 规范概要

    命名冲突和文件依赖,是前端开发过程中的两个经典问题.通过模块化开发来解决. AMD 规范在这里:https://github.com/amdjs/amdjs-api/wiki/AMD CMD 规范在这 ...

  9. linux cut: invalid byte, character or field list Try 'cut --help' for more information.

    1. 概述 centos执行简单shell 脚本 报错 cut: invalid byte, character or field listTry 'cut --help' for more info ...

  10. Yii2.0 新建项目通用准备工作

    1.设置 cookieValidationKey 在 config/web.php 中 config 里有 components项中request有个cookieValidationKey需要配置参数 ...