【Atcoder】 [ARC150D] Removing Gacha

题目链接

点击打开链接

题目解法

考虑期望的线性性, A n s = ∑ i = 1 n E ( X i ) Ans=\sum\limits_{i=1}^{n}E(X_i) Ans=i=1∑nE(Xi)

其中 E ( X i ) E(X_i) E(Xi) 为选 i i i 的期望次数

考虑点 i i i 有关的点只有它的祖先

因为我们当前求的是 i i i 的期望次数,和它祖先选的次数没有关系,所以我们可以考虑忽略 "它或它的任意一个祖先未被选中" 的条件

所以将问题转化成了有 d e p t h i depth_i depthi 个点,每次随机抽一个点,知道所有点都被抽过(否则之后 i i i 也可能被抽),求第 d e p t h i depth_i depthi 个点被抽的期望次数

考虑当前剩下了 k k k 个点,下一个抽到之前未抽过的点的概率是 d e p t h i − k d e p t h i \frac{depth_i-k}{depth_i} depthidepthi−k,所以期望步数为 d e p t h i d e p t h i − k \frac{depth_i}{depth_i-k} depthi−kdepthi

所以抽完 d e p t h i depth_i depthi 个点的期望步数为 ∑ k = 0 d e p t h i − 1 d e p t h i d e p t h i − k \sum\limits_{k=0}^{depth_i-1}\frac{depth_i}{depth_i-k} k=0∑depthi−1depthi−kdepthi

所以第 i i i 个点被抽中的期望次数即为 ∑ k = 0 d e p t h i − 1 1 d e p t h i − k = ∑ k = 1 d e p t h i 1 k \sum\limits_{k=0}^{depth_i-1}\frac{1}{depth_i-k}=\sum\limits_{k=1}^{depth_i}\frac{1}{k} k=0∑depthi−1depthi−k1=k=1∑depthik1

直接计算即可

时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N=200100,P=998244353;
int n,d[N];
int e[N<<1],ne[N<<1],h[N],idx;
inline int read(){
	int FF=0,RR=1;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
	for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
	return FF*RR;
}
void add(int x,int y){ e[idx]=y,ne[idx]=h[x],h[x]=idx++;}
void dfs(int u){
	for(int i=h[u];~i;i=ne[i]) d[e[i]]=d[u]+1,dfs(e[i]);
}
int qmi(int a,int b){
	int res=1;
	for(;b;b>>=1){
		if(b&1) res=1ll*res*a%P;
		a=1ll*a*a%P;
	}
	return res;
}
int main(){
	memset(h,-1,sizeof(h));
	n=read();
	for(int i=2;i<=n;i++){
		int fa=read();
		add(fa,i);
	}
	d[1]=1,dfs(1);
	h[1]=1;
	for(int i=2;i<=n;i++) h[i]=(h[i-1]+qmi(i,P-2))%P;
	int ans=0;
	for(int i=1;i<=n;i++) ans=(ans+h[d[i]])%P;
	printf("%d\n",ans);
	fprintf(stderr,"%d ms\n",int(1e3*clock()/CLOCKS_PER_SEC));
	return 0;
}
相关推荐
alphaTao3 小时前
LeetCode 每日一题 2026/8/24-2026/8/30
python·算法·leetcode
Interview Aid1123 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
顶点多余12 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
罗西的思考14 小时前
【Agentic RL / 强化学习框架】Molt 设计解读
人工智能·算法·机器学习
hahaha601614 小时前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
多弗朗皮卡丘15 小时前
算法详解4:买卖股票的最佳时机系列(上)
算法
维克兜率天17 小时前
【维克】动量指标家族:RSI、ROC、CCI、Momentum全面解析
python·算法
AI情绪识别开源18 小时前
检信 AI 智能推广平台(代号:JX-Promote)
人工智能·算法·erlang
老当益壮梁奶奶19 小时前
Linux软件编程学习笔记(八):进程间通信详解(1)
linux·c语言·笔记·学习·算法
不会就选b19 小时前
算法日常・每日刷题--<BFS拓扑排序>4
算法