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: Accepted)

using System;
using System.Collections.Generic;
class Program
    {
        static long mod = 998244353;
        static long pow(long a, long n)
        {
            a %= mod;
            long ret = 1;
            long buf = a;
            while (true)
            {
                if((n & 1) == 1) ret = ret * buf % mod;
                else if (n == 0) break;
                buf = buf * buf % mod;
                n >>= 1;
            }
            return ret;
        }
        static long inv2 = pow(2, mod - 2);
        static void Main(string[] args)
        {   
            int n = int.Parse(Console.ReadLine());
            int[] a = new int[n+1];
            for (int i=0; i<n; i++) a[i+1] = int.Parse(Console.ReadLine());
            long[,] dp = new long[n + 1, 300 * n + 1];
            long[,] dp2 = new long[n + 1, 300 * n + 1];
            dp[0, 0] = pow(2, n);
            dp2[0, 0] = 1;
            int sum = 0;
            for (int i=1; i<=n; i++)
            {
                sum += a[i];
                for (int j=0; j<=300*n; j++)
                {
                    if (j < a[i])
                    {
                        dp[i,j] = dp[i-1, j];
                        dp2[i, j] = dp2[i-1, j];
                    }
                    else 
                    {
                        dp[i, j] = (dp[i-1, j] + dp[i-1, j-a[i]] * inv2) % mod;
                        dp2[i, j] = (dp2[i-1, j] + dp2[i-1, j-a[i]]) % mod;
                    }
                }
            }
            long ngCase = 0;
            for (int i=sum/2+1; i<=sum; i++)
            {
                ngCase += dp[n, i];
                ngCase %= mod;
            }
            ngCase = ngCase * 3 % mod;
            if (sum % 2 == 0)
            {
                ngCase = (ngCase + 3 * dp[n, sum/2] % mod - 3 * dp2[n, sum/2]) % mod;
            }
            long ans = pow(3, n) - ngCase;
            ans %= mod;
            if (ans < 0) ans += mod;
            Console.WriteLine(ans);

        }
    }
    //mcs Main.cs
    //mono Main.exe