#Lutece2930. 末日时在做什么?有没有空?可以来数兔子吗?
末日时在做什么?有没有空?可以来数兔子吗?
Migrated from Lutece 2930 末日时在做什么?有没有空?可以来数兔子吗?
All parts of this problem, including description, images, samples, data and checker, might be broken. If you find bugs in this problem, please contact the admins.
Description
Tag:重链剖分维护矩阵 or 重链剖分维护斐波那契通项公式
给定一棵个点的有根树(即个点、条边的连通图),点编号到,根节点为号点。 每个点都有两种权值:A类权值和B类权值。以下修改操作都针对A类权值,而B类权值则是A类权值的函数,随A类权值的变化而变化,且二者恒满足。其中表示斐波那契数列(兔子数列)的第项的值。 你需要写一个数据结构实现以下操作:
- 修改操作:给定参数和,表示让子树内所有点的A类权值都加上。
- 询问操作:给定参数,表示询问的子树内所有点的B类权值之和。
- 修改操作:给定参数、和,表示让到路径上所有点(包括和)的A类权值都加上。
- 询问操作:给定参数、,表示询问到路径上所有点(包括和)的B类权值之和。 由于结果可能很大,你只需要输出询问答案对取模的结果。
Input
第一行是一个整数,表示点的个数。 第二行是个整数,第个整数表示点的初始A类权值。 第三行是个整数,第个整数表示点的父节点编号。 第四行是一个整数,表示操作总数。 接下来行,每行用若干个整数描述一次操作,每行第一个整数记作。 若,则接下来有两个整数和,表示让点子树内所有点的A类权值都加上。 若,则接下来有一个整数,表示询问点的子树内所有点的B类权值之和。 若,则接下来有三个整数、和,表示让到路径上所有点(包括和)的A类权值都加上。 若,则接下来有两个整数、,表示询问到路径上所有点(包括和)的B类权值之和。
Output
对于每一次询问操作,输出一行一个整数,表示答案对取模的结果。
Samples
6
1 1 4 5 1 4
1 1 2 2 3
6
2 1
4 5 6
1 4 1
3 5 6 1
2 6
4 5 6
14
9
5
13
Constraints
Note
- 树是指个点、条边的连通图,树上任意两点间都有且只有一条路径。如果到根的路径经过了,则认为在的子树内。特别地,在的子树内。
- 斐波那契数列满足以下递推式:
- 对于取模的意义下的运算,加法、减法和乘法正常运算后取模即可,除法需要借助逆元转化为乘法运算。如果你不知道逆元的概念,也没关系,你只需要知道:在模意义下,形如的运算等价于。至于如何快速计算,请自行百度并掌握快速幂这一基本技巧。如果没有学习过逆元的基本概念,建议尽快了解费马小定理的内容,学习逆元的快速幂求法和线性递推求法,因为类似的取模运算在各个专题均可能高频率出现。
Resources
2023 UESTC ICPC Training for Data Structures