https://www.nowcoder.com/acm/contest/156/F
注意到轮数的期望就是每个点被选中的概率之和,熟悉概率与期望定义的同学很 容易看出,这样就是说这个点要在他到根的路径上的点集中第一次选中(不然他 就被砍掉了)
这个概率是 1/dep[i], dfs 后算下 1/dep[i]的总和即可
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define LL long long
const LL maxn = 1e5+33;
const LL mod = 998244353;
vector<LL>G[maxn];
LL qkm(LL base,LL mi)
{
LL ans=1;
while(mi){
if(mi&1) ans=ans*base%mod;
base=base*base%mod;
mi>>=1;
}
return ans;
}
LL dfs(LL x,LL pre,LL dep)
{
LL ans=0;
ans+=qkm(dep,mod-2);
for(LL i=0;i<G[x].size();i++){
if(G[x][i]==pre) continue;
(ans+=dfs(G[x][i],x,dep+1))%=mod;
}
return ans;
}
int main()
{
LL n;
scanf("%lld",&n);
for(LL i=1;i<n;i++){
LL u,v;scanf("%lld%lld",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
printf("%lld\n",dfs(1,-1,1));
return 0;
}