专栏文章
ARC150D Removing Gacha 题解
AT_arc150_d题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minmf7cf
- 此快照首次捕获于
- 2025/12/02 04:47 3 个月前
- 此快照最后确认于
- 2025/12/02 04:47 3 个月前
显然总期望操作次数等于每个点期望操作次数之和,于是考虑对于每个点 ,计算点 被操作次数的期望。
设点 的深度为 ,那么点 是否还需要被操作只和点 到根路径上的 个点的状态有关,所以我们可以只考虑这 个点。
于是现在问题转化为了,有 个点,每次随机选择一个点,直到每个点都被选择过为止,求第 个点被选择次数的期望。
设当前已经选择了 个点,那么有 的概率选择到一个新点,也就是期望 次选择到一个新点。相加可以得到总的期望选择次数等于 ,而每个点被选择到的概率相等,所以第 个点期望被选择 次。
将所有点期望操作次数相加,得到答案为 。直接计算即可,时间复杂度 。
Cconst int N=2e5+5,mod=998244353;
int n,p[N],d[N],ans,fac[N],infac[N],inv[N],pre[N];
int ksm(int a,int b){
int res=1;
while(b){
if(b&1) res=1ll*res*a%mod;
b>>=1,a=1ll*a*a%mod;
}
return res;
}
void solve(){
cin>>n;
for(int i=2;i<=n;i++) cin>>p[i];
fac[0]=infac[0]=1;
for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mod;
infac[n]=ksm(fac[n],mod-2);
for(int i=n-1;i>0;i--) infac[i]=1ll*infac[i+1]*(i+1)%mod;
for(int i=1;i<=n;i++) inv[i]=1ll*fac[i-1]*infac[i]%mod;
for(int i=1;i<=n;i++) pre[i]=(pre[i-1]+inv[i])%mod;
for(int i=1;i<=n;i++) d[i]=d[p[i]]+1,ans=(ans+pre[d[i]])%mod;
cout<<ans<<endl;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...