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# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
static class Program{
	const int mod=998244353;
	static void Main(){
		Sc sc=new Sc();
		int n=sc.I;
		int[,,] dp=new int[n+1,90001,4];
		dp[0,0,0]=1;
		int m=0,p=0;
		for(int i=0;i<n;i++){
			int a=sc.I;
			for(int j=0;j<=m;j++){
				for(int k=0;k<4;k++){
					dp[i+1,j+a,k]=(dp[i+1,j+a,k]+dp[i,j,k])%mod;
					dp[i+1,j,k|1]=(dp[i+1,j,k|1]+dp[i,j,k])%mod;
					dp[i+1,j,k|2]=(dp[i+1,j,k|2]+dp[i,j,k])%mod;
				}
			}
			m+=a;
		}
		for(int j=m/2+(m%2);j<=m;j++){p=(p+dp[n,j,3])%mod;}
		if(m%2==0){p=(p-dp[n,m/2,1]*3+mod)%mod;}
		int[,] dp2=new int[n+1,4];
		dp2[0,0]=1;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=3;j++){dp2[i,j]=(dp2[i-1,j]*j+dp2[i-1,j-1]*j)%mod;}
		}
		Console.WriteLine("{0}",(dp2[n,3]-p*3+mod)%mod);
	}
}

public class Sc{
	public int I{get{return int.Parse(Console.ReadLine());}}
	public long L{get{return long.Parse(Console.ReadLine());}}
	public double D{get{return double.Parse(Console.ReadLine());}}
	public string S{get{return Console.ReadLine();}}
	public int[] Ia{get{return Array.ConvertAll(Console.ReadLine().Split(),int.Parse);}}
	public int[] Ia2{get{return Array.ConvertAll(("0 "+Console.ReadLine()+" 0").Split(),int.Parse);}}
	public long[] La{get{return Array.ConvertAll(Console.ReadLine().Split(),long.Parse);}}
	public long[] La2{get{return Array.ConvertAll(("0 "+Console.ReadLine()).Split(),long.Parse);}}
	public double[] Da{get{return Array.ConvertAll(Console.ReadLine().Split(),double.Parse);}}
	public string[] Sa{get{return Console.ReadLine().Split();}}
}