题解:
分两种情况
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)
ans1=i=1∏n(a[i]+1)
2.不包含根节点
对于每一条链,有a[i]个节点,那么这条链能形成的子树个数是
a
[
i
]
∗
(
a
[
i
]
+
1
)
2
\frac{a[i]*(a[i]+1)}{2}
2a[i]∗(a[i]+1)。
因为没跟根节点连接,就不能乘了,要加起来。
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}
ans2=i=1∑n2a[i]∗(a[i]+1)
a
n
s
=
a
n
s
1
+
a
n
s
2
ans=ans_1+ans_2
ans=ans1+ans2
C
o
d
e
:
Code:
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;
}