链接:https://www.nowcoder.com/acm/contest/204/I
来源:牛客网
题目描述
小 A 有一棵长的很奇怪的树,他由 n 条链和 1 个点作为根构成,第 i 条链有 ai 个点,每一条链的一端都与根结点相连。
现在小 A 想知道,这棵长得奇怪的树有多少非空的连通子树,你只需要输出答案对 998244353 取模的值即可
输入描述:
第一行一个正整数 n
第二行 n 个正整数 a1…an
输出描述:
输出答案对 998244353 取模后的值
示例1
输入
2
1 1
输出
6
备注:
1≤ n≤ 105
1≤ ai≤ 107
先贴代码
#include <iostream>
#define ll long long
const ll mod = 998244353;
using namespace std;
int main()
{
int n;
scanf("%d", &n);
ll s1 = 0, s2 = 1, s3 = 0;
for (int i = 0; i < n; i++)
{
scanf("%lld", &s1);
s2 += s1 * s2;
s2 %= mod;
s3 += s1 * (s1 + 1) / 2;
s3 %= mod;
}
printf("%lld\n", (s2 + s3) % mod);
}
自己的思路
挺有意思的一个题目,记录一下,s2表示当前链到达根节点或其他链节点的连通子树的个数,s3表示当前链的内部可以构成的连通子树的个数,不理解不妨到纸上模拟一下,这个是真的妙啊。