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 (GCC 5.4.1) (judge verdict: Accepted)

#include "bits/stdc++.h"
using namespace std;
typedef long long li;

const li mod = 998244353;
const li max_v = 300 * 300 + 5;

li pow(li x, li n) {
    if (n == 0) {
        return 1;
    }
    if (n == 1) {
        return x;
    }

    li sq = pow(x, n / 2);
    if (n & 1) {
        return sq * sq % mod * x % mod;
    }
    return sq * sq % mod;
}

li inv(li x) {
    return pow(x, mod - 2);
}


int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);

    li n;
    cin >> n;

    vector<li> ls(n);
    for (int i = 0; i < n; ++i) {
        cin >> ls[i];
    }

    const li total = accumulate(ls.begin(), ls.end(), 0LL);

    vector<li> dbl(max_v, 0), sin(max_v, 0);
    dbl[0] = pow(2LL, n);
    sin[0] = 1;

    const li inv2 = inv(2LL);
    for (int i = 0; i < n; ++i) {
        for (int j = max_v - 1; j >= 0 ; --j) {
            int prev = j - ls[i];
            if (prev < 0) {
                break;
            }
            dbl[j] += dbl[prev] * inv2 % mod;
            dbl[j] %= mod;
            sin[j] += sin[prev];
            sin[j] %= mod;
        }
    }

    li notans = 0;
    for (int i = 0; i < max_v; ++i) {
        if (i * 2 < total) {
            continue;
        }
        if (i * 2 == total) {
            notans = (notans - sin[i] % mod + mod) % mod;
        }
        notans += dbl[i];
        notans %= mod;
    }

    notans = notans * 3 % mod;
    li ans = (pow(3LL, n) - notans + mod) % mod;
    cout << ans << endl;

    return 0;
}