牛客国庆集训派对Day4I-连通块计数

版权声明:不念过去,不畏未来,一切都是过眼云烟。 https://blog.csdn.net/qq_34531807/article/details/83216553


题解:
分两种情况
1.包含根节点
对于每一条链,链的末端与根节点相连,构成了一个回路,每一条链有a[i]个点,那么就有在这条链选0个、选1个、选2个…选a[i]个,共a[i]+1种情况,
要构成连通子树,必须得是相连的,就是根-1,根-1-2,根-1-2-3…这样的情况,不可能直接选中途的1-2这样
a n s 1 = i = 1 n ( a [ i ] + 1 ) ans_1=\prod_{i=1}^n(a[i]+1)
2.不包含根节点
对于每一条链,有a[i]个节点,那么这条链能形成的子树个数是 a [ i ] ( a [ i ] + 1 ) 2 \frac{a[i]*(a[i]+1)}{2}
因为没跟根节点连接,就不能乘了,要加起来。 a n s 2 = i = 1 n a [ i ] ( a [ i ] + 1 ) 2 ans_2=\sum_{i=1}^n\frac{a[i]*(a[i]+1)}{2}
a n s = a n s 1 + a n s 2 ans=ans_1+ans_2
C o d e Code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=998244353,N=1e5+5;
int n;ll a[N];
int main()
{
	scanf("%d",&n);
	ll ans1=1,ans2=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
		ans1=ans1*(a[i]+1)%mod;
		ans2=(ans2+(a[i]+1)*a[i]/2)%mod;
	}
	printf("%lld\n",(ans1+ans2)%mod);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34531807/article/details/83216553