luogu#P10121. 『STA - R4』保险丝
『STA - R4』保险丝
题目背景
APJ:「?我家保险丝怎么又没了」
UPD. 已经更换模数()
题目描述
给一棵 个点的有根树,根是 号结点。
定义两个点集 的距离为从两个集合分别选出一个点,能得到两点间距离的最小值,即 $\displaystyle\operatorname{dist}(S_1,S_2)=\min_{\substack{u\in S_1\\v\in S_2}}\operatorname{dist}(u,v)$,其中 是点 间的距离。
定义 是 到 的简单路径上的所有点组成的集合, 是所有叶子组成的集合。
对于固定正整数 ,定义满足如下条件的结点 构成 的半邻域 :
- 在 子树内;
- $\operatorname{dist}(u,v)\le\operatorname{dist}(\operatorname{path}(1,v),\mathcal L)$。
即 的半邻域 包含 的子树内所有满足到 的距离不大于它到根的路径上任意一点离最近叶子节点的距离的点。
进而定义:
$$f(x)=\sum_{u\in\mathring U(x)}\prod_{\substack{v\in\operatorname{subtree}(u)\\v\in\mathring U(x)}}F_{\deg v} $$其中 是 子树中所有点组成的集合, 是 的度数, 是 Fibonacci 数列:
$$F_n=\begin{cases}1&n\le 2\\F_{n-1}+F_{n-2}&n\ge 3\end{cases} $$即 对应 的半邻域中点对 的贡献之和。而一个点 对 的贡献的计算方式为:取出每个 子树内处在 半邻域中的点 ,若 的度数为 ,则将 的贡献乘上 ,所有 的贡献之和为结果。
你需要求出 的值,为减少输出量,你只需要输出它们模 后的异或和,即 即可。
输入格式
第一行一个正整数 表示点数。
第二行 个正整数,第 个正整数代表了结点 的父亲结点。
输出格式
一行,表示 的值。
7
1 1 2 2 3 3
8
14
1 2 3 3 2 6 6 6 9 9 10 11 12
25
提示
本题采用捆绑测试。
- Subtask 1 (10pts):。
- Subtask 2 (20pts):树的叶子个数不大于 。
- Subtask 3 (20pts):树中没有恰有一个儿子的结点。
- Subtask 4 (50pts):无特殊限制。
对于全部数据,,每个非根结点父亲的编号小于它的编号。