Problem:
Score : 300 points

Problem Statement

Given is an integer sequence D_1,...,D_N of N elements. Find the number, modulo 998244353, of trees with N vertices numbered 1 to N that satisfy the following condition:

For every integer i from 1 to N, the distance between Vertex 1 and Vertex i is D_i.

Notes

A tree of N vertices is a connected undirected graph with N vertices and N-1 edges, and the distance between two vertices are the number of edges in the shortest path between them.

Two trees are considered different if and only if there are two vertices x and y such that there is an edge between x and y in one of those trees and not in the other.

Constraints

1 \leq N \leq 10^5

0 \leq D_i \leq N-1

Input

Input is given from Standard Input in the following format:

N
D_1 D_2 ... D_N

Output

Print the answer.

Sample Input 1

4
0 1 1 2

Sample Output 1

2

For example, a tree with edges (1,2), (1,3), and (2,4) satisfies the condition.

Sample Input 2

4
1 1 1 1

Sample Output 2

0

Sample Input 3

7
0 3 2 1 2 2 1

Sample Output 3

24

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#define FOR(i,n) for(int (i)=0;(i)<(int)(n);++(i))
#define FORUL(i,l,u) for(int (i)=(int)(l);(i)<(int)(u);++(i))
#define FORULE(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i))
#define FOREACH(it, X) for(__typeof((X).begin()) it = (X).begin(); it != (X).end(); it++)
#if defined(_MSC_VER) || __cplusplus > 199711L
#define AUTOVAR(newvar,v) auto newvar = (v)
#else
#define AUTOVAR(newvar,v) __typeof(newvar) r = (v)
#endif
#define PB(x) push_back(x)
#define MP(x,y) make_pair((x),(y))
#define MEMSET(m,v) memset(m,v,sizeof(m))

typedef long long				 ll;
typedef unsigned long long		ull;

#define DEBUG 0

#if DEBUG
#define DOUT cout<<"["<<__LINE__<<"]:"
#else
#define DOUT 0 && cout
#endif

using namespace std;

#define MAX_N (1000*100)

int N;
int D[MAX_N+5];
#define DIVN  (998244353)
vector<ll> P[MAX_N+5];

bool pairless(const pair<int,int> &lhs, const pair<int,int> &rhs)
{
	return lhs.second < rhs.second;
}

int main(int argc, char *argv[])
{
	ios::sync_with_stdio(false);

	cin >> N;
	FOR(n,N) {
		cin >> D[n];
		P[D[n]].push_back(n);
	}

	ll ans = 0;
	int count=0;
	int d=0;
	int prev = 0;
	for(; d<N; d++) {
		if(d==0) {
			if(P[d].size()!=1 || P[d][0]!=0) {
				ans = 0;
				DOUT << "break: 1"<<endl;
				break;
			}
			count = 1;
			prev = 1;
			ans = 1;
			DOUT << "[d="<<d<<"]: P[d].size()="<<P[d].size()<<", count="<<count<<", ans="<<ans<<endl;
			continue;
		}

		if(P[d].size()==0) {
			break;
		}
		count += P[d].size();
		ll inc = 1;
		for(int i=0; i<P[d].size(); i++) {
			inc *= prev;
			inc %= DIVN;
		}
		ans = ans  * inc % DIVN;
		DOUT << "[d="<<d<<"]: P[d].size()="<<P[d].size()<<", count="<<count<<", ans="<<ans<<endl;
		prev = P[d].size();
	}
	if(count!=N) {
		ans = 0;
	}

	cout << ans << endl;

	return 0;
}