最新消息:380元/半年,推荐全网最具性价比的一站式编程学习平台码丁实验室

信息学奥赛题库- 树上斐波那契

C++ 少儿编程 1062浏览 0评论

友情提示:380元/半年,儿童学编程,就上码丁实验室

【题目描述】

定义$fibonacci$数列第$i$项为$Fib(i)$,对于任意的大于等于$3$的$i$,有$Fib(i)=Fib(i-1)+Fib(i-2)$,令$Fib(1)=Fib(2)=1$。

再给出一个有根树$T$,$T$一共有$n$个节点,从$1sim n$编号,$1$号节点为根,每个点有一个权值,初始的时候都是$0$,现在有$2$种操作:

U X k

更新操作,对于在$X$的子树中的每一个节点(包括$X$),如果它到$X$的距离(即这个点到$X$的唯一简单路径上经过的边数)为$D$,那么将它的权值加上$Fib(k+D)$。

Q X Y

询问操作,询问$X$到$Y$的简单路径上的所有点的权值之和(包括$X$和$Y$),将所求的权值和$lmod 10^9+7$之后输出。

【输入】

第$1$行两个用空格隔开的正整数$n,m$表示节点个数和操作个数。

第$2sim n$行,第$i$行一个数$x$,表示节点$i$在树上的父亲是$x$。

接下来$m$行,每行一个形如”U X k“或”Q X Y“的操作。

【输出】

对于每一个询问操作,输出一行为对应顺序的询问操作的答案。

【输入样例】

5 10
1
1
2
2
Q 1 5
U 1 1
Q 1 1
Q 1 2
Q 1 3
Q 1 4
Q 1 5
U 2 2
Q 2 3
Q 4 5

【输出样例】

0
1
2
2
4
4
4
10

【提示】

【样例解释】

这是前$2$个更新操作的情况:

【数据规模】

对于30%的数据:$n,m≤1000,k≤100$;

对于另外30%的数据:每个节点的父亲是在编号小于它的节点中随机产生的;

对于100%的数据:$n,m≤10^5$,$1≤X,Y≤n,k≤10^{15}$。

您必须 登录 才能发表评论!