1. 程式人生 > >UPC-9560 連通塊計數

UPC-9560 連通塊計數

題目傳送門

題目描述:

小A有一棵長的很奇怪的樹,他由n條鏈和1個點作為根構成,第i條鏈有ai個點,每一條鏈的一端都與根結點相連。
現在小A想知道,這棵長得奇怪的樹有多少非空的連通子樹,你只需要輸出答案對998244353取模的值即可

輸入

第一行一個正整數n
第二行n個正整數a1…an 
1≤n≤105
1≤ai≤107

輸出

輸出答案對998244353取模後的值

題解:總的連通塊數等於不包含中心的連通塊數量和包含中心的連通塊數量的數量之和;不包含中心的連通塊數量sum1=每條鏈上的連通塊的數量之和=∑(a[i]+(a[i]*(a[i]-1))/2)=∑(a[i]*(a[i]+1)/2;包含中心的連通塊數sum2=∏sum2+sum2*a[i]=∏sum2*(a[i]+1)

AC程式碼:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
using namespace std;
#define io ios::sync_with_stdio(0),cin.tie(0)
#define ms(arr) memset(arr,0,sizeof(arr))
#define inf 0x3f3f3f
typedef long long ll;
const int mod=998244353;
const int maxn=1e5+7;
int n;
ll a[maxn];
int main()
{
    io;
    cin>>n;
    ll sum1,sum2;
    sum1=0;
    sum2=1;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        sum1=(sum1+(a[i]*(a[i]+1)/2))%mod;
        sum2=(sum2+sum2*a[i])%mod;
    }
    cout<<(sum1+sum2)%mod<<endl;
    return 0;
}