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: Wrong Answer)

#include <bits/stdc++.h>
#include <math.h>
#define wow 998244353

using namespace std;

int q_sort(int d[],int left,int right){
	if(left >= right) return 0;
	int pipot = d[(left+right)/2], l = left, r = right, tmp;
	while(l<r){
		while(d[l] < pipot) l++;
		while(d[r] > pipot) r--;
		if( l <=  r){
			tmp = d[l];
			d[l] = d[r];
			d[r] = tmp;
			l++;
			r--;
		}
	}
	q_sort(d,left,r);
	q_sort(d,l,right);
}

long long int rui(int num,int k){
	long long int re = 1;
	int i = 0;
	for(i = 0; i < k;i++){
		re = num * re;
		re = re % wow;
	}
	return re;
}
int main(void){
	int N;
	cin >> N;
	int D[N];
	long long int ans = 1;
	long long int k = 0;
	int kosuu,j,ue_num,i;
	int flag = 0;
	for(i = 0; i < N;i++){
		cin >> D[i];
	}
	q_sort(D,0,N-1);
	if(D[0] != 0 || D[1] != 1){
		cout << "0"<<endl;
		return 0;
	}
	j = 1;
	i = 1;
	ue_num = 1;
	while(1){
		kosuu = 0;
		while(j == D[i]){
			i++;
			kosuu++;
		}
		//cout << "ue_num = "<<ue_num<<" kosuu = "<< kosuu<<" j = "<<j<<" i = "<<i<<endl;
		j++;
		k = rui(ue_num,kosuu);
		//cout << "ue_num = "<<ue_num<<" kosuu = "<< kosuu<<" j = "<<j<<" i = "<<i<<endl;
		//cout <<"k = "<<k<<endl;
		ans = ans * k;
		ue_num = kosuu;
		ans = ans % wow;
		if(i >= N) break;
	}
	int renban = 0;
	for(i=0;i<N;i++){
		if(renban != D[i]){
			flag == 1;
			break;
		}
		while(renban == D[i])
		{
			i++;
		}
		renban++;
	}
	int koko = 0;
	if(flag == 0) cout <<ans<< endl;
	else cout<<koko<<endl;
	//cout << "wow = "<<wow<<endl;
	return 0;
}