Problem:
Score : 600 points

Problem Statement

You are given N integers. The i-th integer is a_i.
Find the number, modulo 998244353, of ways to paint each of the integers red, green or blue so that the following condition is satisfied:

Let R, G and B be the sums of the integers painted red, green and blue, respectively. There exists a triangle with positive area whose sides have lengths R, G and B.

Constraints

3 \leq N \leq 300

1 \leq a_i \leq 300(1\leq i\leq N)

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
a_1
:
a_N

Output

Print the number, modulo 998244353, of ways to paint each of the integers red, green or blue so that the condition is satisfied.

Sample Input 1

4
1
1
1
2

Sample Output 1

18

We can only paint the integers so that the lengths of the sides of the triangle will be 1, 2 and 2, and there are 18 such ways.

Sample Input 2

6
1
3
2
3
5
2

Sample Output 2

150

Sample Input 3

20
3
1
4
1
5
9
2
6
5
3
5
8
9
7
9
3
2
3
8
4

Sample Output 3

563038556

Solution in C++14 (Clang 3.8.0) (judge verdict: Runtime Error)

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <map>
#include <list>
#include <set>
#include <numeric>
#include <queue>
#include <stack>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <climits>
#include <cfloat>
#include <ctime>
#include <complex>
#include <cassert>
#include <array>
#include <bitset> 
#include <unordered_map>

using namespace std;
typedef long long LL;
typedef pair<int,int> P;

const LL M=998244353;
const int L=300*300+1;
LL dp[300][L];
LL dp2[300][L];
int main() {
	int N;
	cin >> N;
	dp[0][0]=1;
	dp2[0][0]=1;
	LL ret=1;
	LL sum=0;
	for(int i=1;i<=N;i++){
		ret*=3;
		ret%=M;
		for(int j=0;j<L;j++){
			dp[i][j]=2*dp[i-1][j];
			dp[i][j]%=M;
			dp2[i][j]=dp2[i-1][j];
		}
		int v;
		cin >> v;
		sum+=v;
		for(int j=0;j+v<L;j++){
			dp[i][j+v]+=dp[i-1][j];
			dp[i][j+v]%=M;
			dp2[i][j+v]+=dp2[i-1][j];
			dp2[i][j+v]%=M;
		}
	}
	//cerr << ret << ", " << sum << endl;
	for(int i=0;i<L;i++){
		if(i>=sum-i){
			ret+=M-(3*dp[N][i]%M);
			ret%=M;
		}
		if(2*i==sum){
			//cerr << dp2[N][i] << endl;
			ret+=3*dp2[N][i]%M;
			ret%=M;
		}
	}
	cout << ret << endl;




	return 0;
}