1. 程式人生 > >牛客國慶集訓派對Day4I-連通塊計數

牛客國慶集訓派對Day4I-連通塊計數

題解: 分兩種情況 1.包含根節點 對於每一條鏈,鏈的末端與根節點相連,構成了一個迴路,每一條鏈有a[i]個點,那麼就有在這條鏈選0個、選1個、選2個…選a[i]個,共a[i]+1種情況, 要構成連通子樹,必須得是相連的,就是根-1,根-1-2,根-1-2-3…這樣的情況,不可能直接選中途的1-2這樣 ans1=i=1n(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[i]+1)。 因為沒跟根節點連線,就不能乘了,要加起來。ans2=i=1na[i](a[i]+1)2ans_2=\sum_{i=1}^n\frac{a[i]*(a[i]+1)}{2} ans=ans1+ans2ans=ans_1+ans_2 CodeCode:

#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;
}