7391. 【2021.11.17NOIP提高组联考】图

Description

给定 \(n\) 个点 \(m\) 条边的无向图(不保证联通)。

每次操作随机删去一个点,如果一个点连向的所有点都被删掉了,那么这个点也会消失。

求期望多少次操作能把这个图删空。答案对 \(998244353\) 取模。

\(n\le 10^5,m\le 2\times 10^5\)

Solution

直接上结论,若节点 \(i\) 的入度为 \(d_i\),答案为 \(\sum_{i=1}^n\frac{d_i}{d_i+1}\)

证明的话也非常的简单,我们思考每一个点在所有情况中我们主动删去它的概率,当且仅当这个点的所有连向的点都被删掉且该点还没有被删掉的时候,这个点不是被我们主动删掉的,也就是我们考虑的这个点是 \(d_{i}+1\) 个点中最后一个被删掉的点,(注意因为中间的点没有被删掉,所以此时它周围的点都是不可能因为周围没有点而被删掉的),所以这个点就有 \(\frac{d_{i}}{d_{i}+1}\) 概率被主动删掉。

Code

#include<cstdio>
#define N 100005
#define mod 998244353
using namespace std;
int n,m,x,y,du[N];
long long ans,ni[N];
int main()
{
	freopen("graph.in","r",stdin);
	freopen("graph.out","w",stdout);
	scanf("%d%d",&n,&m);
	ni[0]=ni[1]=1;
	for (int i=2;i<=n;++i)
		ni[i]=ni[i]=(long long)(mod-mod/i)*ni[mod%i]%mod;
	for (int i=1;i<=m;++i)
		scanf("%d%d",&x,&y),++du[x],++du[y];
	for (int i=1;i<=n;++i)
		ans=(ans+du[i]*ni[du[i]+1]%mod)%mod;
	printf("%lld\n",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/Livingston/p/15569442.html