|
||||||||||
Link Cut TreeTime Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 90 Accepted Submission(s): 21 Problem Description 给一棵$n$个点的有根树,每个点可以选择至多一个儿子作为重儿子。你可以对这棵树进行切换操作,每次选择一个点,指定其中一个儿子作为重儿子,而原来这个点的重儿子(如果有)将不再是重儿子。一开始每个点都没有重儿子。 现在你要进行$m$次操作,每次操作,你会选择一个点(也就是下面的$v_k$),然后得到这个点到根的路径,从根开始记作$v_1, v_2, \dots, v_k$,对于每个$i(1\leq i < k)$,如果$v_i$的重儿子不是$v_{i+1}$,那么会进行一次切换操作,将它的重儿子切换为$v_{i+1}$。你可以指定每次操作选择的点,使得$m$次操作之后切换次数最多。记$m$次操作之后最多的切换次数为$f(m)$。 求$\lim_{m\to +\infty} \frac{f(m)}{m}$的值,对$998244353$取模,可以证明极限存在。 简要题意就是给你一个Link Cut Tree,$f(m)$为执行$m$次access操作之后最坏情况下虚实边切换次数,问你最坏情况下平均的虚实边切换次数。 对于一个分数$a/b$,其中$\gcd(a,b)=1$,那么我们认为这个分数对$998244353$取模的值为一个数$c(0\leq c < 998244353)$满足$bc\equiv a \pmod {998244353}$。 Input 第一行一个正整数$T(1\leq T\leq 10^4)$表示数据组数。 对于每组数据,第一行一个整数$n(1\leq n\leq 5000)$,接下来一行$n-1$个数字$p_2, p_3, \dots, p_n (1\leq p_i < i)$,$p_i$表示$i$的父亲。 保证$\sum n\leq 10^6$。 Output 对于每组数据,输出一个数,表示答案。 Sample Input
Sample Output
Hint 第一组数据是一条链,所以进行 O(1) 次切换之后就再也不用操作。 第二组数据,真实的答案是 7/4。 Source | ||||||||||
|