AT_arc150_d [ARC150D] Removing Gacha题解
AT_arc150_d [ARC150D] Removing Gacha
题目描述
有一棵有 NNN 个顶点的有根树,顶点编号为 111 到 NNN。顶点 111 是这棵树的根,对于每个顶点 i (2≤i)i\ (2\leq i)i (2≤i),其父节点为 pip_ipi。
每个顶点有白色和黑色两种颜色。初始时所有顶点都是白色。
在这棵有根树中,如果从根节点 111 到顶点 iii 的唯一简单路径上的所有顶点(包括 111 和 iii)都是黑色,则称顶点 iii 为“好顶点”。否则称为“坏顶点”。
你需要重复进行如下操作,直到所有顶点都变为黑色为止:从所有“坏顶点”中等概率随机选取一个顶点,并将其涂成黑色。
请你求出将所有顶点都变为黑色所需操作次数的期望值,并对 998244353998244353998244353 取模。
期望值 mod 998244353\bmod\ 998244353mod 998244353 的定义:可以证明,所求的期望值一定是有理数,并且在本题的约束下,若将其表示为最简分数 PQ\frac{P}{Q}QP,则 Q≢0(mod998244353)Q\not\equiv 0\pmod{998244353}Q≡0(mod998244353)。因此,存在唯一的整数 RRR 满足 R×Q≡P(mod998244353), 0≤R<998244353R\times Q\equiv P\pmod{998244353},\ 0\leq R<998244353R×Q≡P(mod998244353), 0≤R<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^52≤N≤2×105
- 1≤pi<i1\leq p_i<i1≤pi<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;
}

浙公网安备 33010602011771号