AT_arc150_d [ARC150D] Removing Gacha题解

AT_arc150_d [ARC150D] Removing Gacha

题目描述

有一棵有 NNN 个顶点的有根树,顶点编号为 111NNN。顶点 111 是这棵树的根,对于每个顶点 i (2≤i)i\ (2\leq i)i (2i),其父节点为 pip_ipi

每个顶点有白色和黑色两种颜色。初始时所有顶点都是白色。

在这棵有根树中,如果从根节点 111 到顶点 iii 的唯一简单路径上的所有顶点(包括 111iii)都是黑色,则称顶点 iii 为“好顶点”。否则称为“坏顶点”。

你需要重复进行如下操作,直到所有顶点都变为黑色为止:从所有“坏顶点”中等概率随机选取一个顶点,并将其涂成黑色。

请你求出将所有顶点都变为黑色所需操作次数的期望值,并对 998244353998244353998244353 取模。

期望值  mod  998244353\bmod\ 998244353mod 998244353 的定义:可以证明,所求的期望值一定是有理数,并且在本题的约束下,若将其表示为最简分数 PQ\frac{P}{Q}QP,则 Q≢0(mod998244353)Q\not\equiv 0\pmod{998244353}Q0(mod998244353)。因此,存在唯一的整数 RRR 满足 R×Q≡P(mod998244353), 0≤R<998244353R\times Q\equiv P\pmod{998244353},\ 0\leq R<998244353R×QP(mod998244353), 0R<998244353。请输出这个 RRR

输入格式

输入为以下格式,从标准输入读取。

NNN p2p_2p2 p3p_3p3 …\dots pNp_{N}pN

输出格式

请输出答案。

输入输出样例 #1

输入 #1

4
1 1 3

输出 #1

831870300

输入输出样例 #2

输入 #2

15
1 2 1 1 4 5 3 3 5 10 3 6 3 13

输出 #2

515759610

说明/提示

数据范围

  • 2≤N≤2×1052\leq N\leq 2\times 10^52N2×105
  • 1≤pi<i1\leq p_i<i1pi<i
  • 输入的所有值均为整数

样例解释 1

例如,假设第 1, 2, 31,\ 2,\ 31, 2, 3 次操作依次选择了顶点 1, 2, 41,\ 2,\ 41, 2, 4。此时,顶点 1, 21,\ 21, 2 是“好顶点”,但顶点 444 由于其祖先顶点 333 仍为白色,所以是“坏顶点”。因此在第 444 次操作时,需要从顶点 3, 43,\ 43, 4 中等概率随机选择一个。将所有顶点变为黑色所需操作次数的期望值为 356\displaystyle\frac{35}{6}635

由 ChatGPT 4.1 翻译

思路

观察发现,对于a节点,其期望值为1/1+…+1/dad_ada,d为深度。

代码见下

#include<bits/stdc++.h> 
using namespace std;
long long n,mod=998244353,fa,d[200005],cc[200005],op=0;
vector<long long> v[200005];
long long pow2(long long a1,long long b1){
    long long k1=1;
    while(b1!=0){
        if(b1%2==1){
            k1=k1*a1%mod;
        }
        a1=a1*a1%mod;
        b1/=2;
    }
    return k1;
}
void abc(long long a1,long long b1){
    d[a1]=b1;
    for(int i=0;i<v[a1].size();i++){
        long long tt=v[a1][i];
        abc(tt,b1+1);
    }
    return ;
}
int main(){
	cin>>n;
    for(int i=2;i<=n;i++){
        cin>>fa;
        v[fa].push_back(i);
    }
    abc(1,1);
    for(int i=1;i<=n;i++){
        cc[i]=(cc[i-1]+pow2(i,mod-2))%mod;
    }
    for(int i=1;i<=n;i++){
        op=(op+cc[d[i]])%mod;
    }
    cout<<op<<endl;
	return 0; 	
}
posted @ 2025-12-11 21:22  bz02_2023f2  阅读(1)  评论(0)    收藏  举报  来源