求和VII
问题 K: 求和VII
时间限制: 2 Sec 内存限制: 256 MB
提交: 422 解决: 53
[提交] [状态] [讨论版] [命题人:admin]
题目描述
输入
之后n−1行每行两个空格隔开的正整数i,j,表示树上的一条连接点i和点j的边。
之后一行一个正整数m,表示询问的数量。
之后每行三个空格隔开的正整数i,j,k,表示询问从点i到点j的路径上所有节点深度的k次方和。由于这个结果可能非常大,输出其对998244353取模的结果。
树的节点从1开始标号,其中1号节点为树的根。
输出
样例输入
5
1 2
1 3
2 4
2 5
2
1 4 5
5 4 45
样例输出
33
503245989
提示
以下用d(i)表示第i个节点的深度。
对于样例中的树,有d(1)=0,d(2)=1,d(3)=1,d(4)=2,d(5)=2。
因此第一个询问答案为(25+15+05) mod 998244353=33,第二个询问答案为(245+145+245) mod 998244353=503245989。
对于30%的数据,1≤n,m≤100;
对于60%的数据,1≤n,m≤1000;
对于100%的数据,1≤n,m≤300000,1≤k≤50。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
const int mod=;
vector<int> a[];
int fa[],b[maxn],n,k;
ll sum[maxn][],ans;
queue<int> rec;
void init()//预处理每个点的1-50次方
{
for(int i=; i<=n; i++)
{
for(int j=; j<=; j++)
{
if(j==) sum[i][j]=b[i];
else sum[i][j]=sum[i][j-]*b[i]%mod;
}
}
}
void digui(int r,int t)//关键部分,递归求路径所有点的k次方
{
if(b[r]<b[t])
{
ans=(ans+sum[t][k])%mod;
digui(r,fa[t]);
}
else if(b[r]>b[t])
{
ans=(ans+sum[r][k])%mod;
digui(fa[r],t);
}
else if(b[r]==b[t]&&fa[r]==fa[t]&&r!=t)
{
ans=(ans+sum[r][k])%mod;
ans=(ans+sum[t][k])%mod;
ans=(ans+sum[fa[r]][k])%mod;
return ;
}
else if(r==t)
{
ans=(ans+sum[r][k])%mod;
return ;
}
else if(b[r]==b[t]&&fa[r]!=fa[t])
{
ans=(ans+sum[r][k])%mod;
ans=(ans+sum[t][k])%mod;
digui(fa[r],fa[t]);
}
}
int read()//读入挂,输入有点多
{
int x=,f=;
char c=getchar();
while((c<'' || c>'') && c!=EOF)
{
if(c=='-') f=-;
c=getchar();
}
while((c<='' && c>='') && c!=EOF)
{
x=x*+c-'';
c=getchar();
}
return x*f;
}
void bfs(int x)//bfs求深度
{
for(int i=; i<a[x].size(); i++)
{
if(b[a[x][i]]==&&a[x][i]!=)
{
fa[a[x][i]]=x;//顺便记录一下父节点
b[a[x][i]]=b[x]+;
rec.push(a[x][i]);
} }
}
int main()
{
n=read();
fa[]=;//attention!
int p,q,cnt=,T,st,en;
for(int i=; i<n; i++)//vector建边
{
p=read();
q=read();
a[p].push_back(q);
a[q].push_back(p);
}
rec.push();
b[]=;//attention!
while(cnt>)
{
p=rec.front();
bfs(p);
rec.pop();
cnt=rec.size();
}
init();
T=read();
while(T--)
{
st=read();
en=read();
k=read();
ans=;
digui(st,en);
printf("%lld\n",ans);
}
return ;
}
求和VII的更多相关文章
- 【LCA】求和VII @北京OI2018
目录 求和VII PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE 求和VII PROBLEM 时间限制: 2 Sec 内存限制: 256 MB 题目描述 m ...
- Java程序:从命令行接收多个数字,求和并输出结果
一.设计思想:由于命令行接收的是字符串类型,因此应先将字符串类型转化为整型或其他字符型,然后利用for循环求和并输出结果 二.程序流程图: 三.源程序代码: //王荣荣 2016/9/23 ...
- Java之递归求和的两张方法
方法一: package com.smbea.demo; public class Student { private int sum = 0; /** * 递归求和 * @param num */ ...
- EXCEL中对1个单元格中多个数字求和
如A1=3779.3759.3769.3781.3750,A2对A1中4个数字求和怎么求!请高手赐教! 方法一:在B1中输入公式=SUM(MID(A1,{1,6,11,16,21},4)*1) 方法二 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- 从sum()求和引发的思考
sum()求和是一个非常简单的函数,以前我的写法是这样,我想大部分和我一样刚开始学习JS的同学写出来的也会是这样. function sum() { var total=null; for(var i ...
- //给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和
//给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和 # include<stdio.h> void main() { ,sum1; ]={,- ...
- Ajax中get请求和post请求
我们在使用Ajax向服务器发送数据时,可以采用Get方式请求服务器,也可以使用Post方式请求服务器,那么什么时候该采用Get方式,什么时候该采用Post方式呢? Get请求和Post请求的区别: 1 ...
- POJ 2823 Sliding Window 线段树区间求和问题
题目链接 线段树区间求和问题,维护一个最大值一个最小值即可,线段树要用C++交才能过. 注意这道题不是求三个数的最大值最小值,是求k个的. 本题数据量较大,不能用N建树,用n建树. 还有一种做法是单调 ...
随机推荐
- 洛谷P1092 虫食算
P1092 虫食算 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: http://paste.ubuntu.com/2544 ...
- 2017-10-4 清北刷题冲刺班a.m
P101zhx a [问题描述]你是能看到第一题的 friends 呢.——hjaHja 拥有一套时光穿梭技术,能把字符串以超越光速的速度传播,但是唯一的问题是可能会 GG.在传输的过程中,可能有四种 ...
- LightOJ 1336 - Sigma Function
原题链接 基础数论中很经典的一道题 题意 给出了σ(n)的计算公式,让你找出整数1-n中有多少对应σ(n)的值是偶数. 思路 观察σ(n)的公式发现,每一个乘项都是 (piei+1 - 1) / (p ...
- ubuntu16.0.4下修改MySQL的data目录之mysqld启动报错
由于需要更换MySQL的data目录,更改完成后启动报错如下: apparmor="DENIED" operation="mknod" profile=&quo ...
- CCF201612-1 中间数(二分思想)
问题链接:CCF201612试题. .对n个数进行排序,找出中间那个数,然后将中间那个数的左右与其相等的数去掉,看左右剩下的数个数是否相等,如果相等则中间那个数就是答案,否在输出-1. 问题描述 问题 ...
- JPA规范基础 ppt教程
https://wenku.baidu.com/view/5ca6ce6a1eb91a37f1115cee.html
- maven插件: shade, assembly
shade插件的作用: 通过版本的exclution无法解决jar冲突的问题, 解决方案是把依赖的包打到本model的jar中,打包的时候由mvn plugin自动修改代码中的依赖jar包名 relo ...
- 【手撸一个ORM】第七步、SqlDataReader转实体
说明 使用Expression(表达式目录树)转Entity的文章在园子里有很多,思路也大致也一样,我在前面有篇文章对解决思路有些说明,有兴趣的小伙伴可以看下 (传送门),刚接触表达式目录树时写的,不 ...
- (转)Linux: dirname、basename命令详解
Linux: dirname.basename命令详解 原文:http://blog.sina.com.cn/s/blog_3f63916f010143vo.html 一.dirname指令 1.功能 ...
- Hadoop文件压缩
1. Hadoop的文件压缩需求 文件压缩对于大容量的分布式存储系统而言是必须的,它能带来两个好处: 1)减少了文件所需的存储空间: 2)加快了文件在网络上或磁盘间的传输速度. 2. Hadoop支持 ...