#P10121. 『STA - R4』保险丝

    ID: 9496 Type: RemoteJudge 1000ms 512MiB Tried: 0 Accepted: 0 Difficulty: 7 Uploaded By: Tags>暴力数据结构线段树O2优化树论虚树其它技巧

『STA - R4』保险丝

题目背景

APJ:「?我家保险丝怎么又没了」

UPD. 已经更换模数(998244353994007158998244353\to994007158

题目描述

给一棵 nn 个点的有根树,根是 11 号结点。

定义两个点集 S1,S2S_1,S_2 的距离为从两个集合分别选出一个点,能得到两点间距离的最小值,即 $\displaystyle\operatorname{dist}(S_1,S_2)=\min_{\substack{u\in S_1\\v\in S_2}}\operatorname{dist}(u,v)$,其中 dist(u,v)\operatorname{dist}(u,v) 是点 u,vu,v 间的距离。

定义 path(u,v)\operatorname{path}(u,v)uuvv 的简单路径上的所有点组成的集合,L\mathcal L 是所有叶子组成的集合。

对于固定正整数 uu,定义满足如下条件的结点 vv 构成 uu 的半邻域 U˚(u)\mathring U(u)

  • vvuu 子树内;
  • $\operatorname{dist}(u,v)\le\operatorname{dist}(\operatorname{path}(1,v),\mathcal L)$。

uu 的半邻域 U˚(u)\mathring U(u) 包含 uu 的子树内所有满足到 uu 的距离不大于它到根的路径上任意一点离最近叶子节点的距离的点。

进而定义:

$$f(x)=\sum_{u\in\mathring U(x)}\prod_{\substack{v\in\operatorname{subtree}(u)\\v\in\mathring U(x)}}F_{\deg v} $$

其中 subtree(u)\operatorname{subtree}(u)uu 子树中所有点组成的集合,degu\deg uuu 的度数,FF 是 Fibonacci 数列:

$$F_n=\begin{cases}1&n\le 2\\F_{n-1}+F_{n-2}&n\ge 3\end{cases} $$

f(x)f(x) 对应 xx 的半邻域中点对 xx 的贡献之和。而一个点 uuxx 的贡献的计算方式为:取出每个 uu 子树内处在 xx 半邻域中的点 vv,若 vv 的度数为 dd,则将 uu 的贡献乘上 FdF_d,所有 uu 的贡献之和为结果。

你需要求出 f(1),f(2),,f(n)f(1),f(2),\cdots,f(n) 的值,为减少输出量,你只需要输出它们模 994007158994007158 后的异或和,即 x=1n(f(x)mod994007158)\bigoplus_{x=1}^n(f(x)\bmod 994007158) 即可。

输入格式

第一行一个正整数 nn 表示点数。

第二行 n1n - 1 个正整数,第 ii 个正整数代表了结点 i+1i + 1 的父亲结点。

输出格式

一行,表示 x=1n(f(x)mod994007158)\bigoplus_{x=1}^n(f(x)\bmod 994007158) 的值。

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):n5000n\le 5000
  • Subtask 2 (20pts):树的叶子个数不大于 3030
  • Subtask 3 (20pts):树中没有恰有一个儿子的结点。
  • Subtask 4 (50pts):无特殊限制。

对于全部数据,2n,q1062\le n,q\le 10^6,每个非根结点父亲的编号小于它的编号。