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

#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
#include<inttypes.h>
#include<string.h>

typedef int32_t i32;
typedef uint32_t u32;
typedef uint64_t u64;

const u32 mod = 998244353;

u32 mod_pow (u32 r, u32 n) {
  u32 t = 1;
  u32 s = r;
  while (n > 0) {
    if (n & 1) t = (u64) t * s % mod;
    s = (u64) s * s % mod;
    n >>= 1;
  }
  return t;
}

void run (void) {
  i32 n;
  scanf ("%" SCNu32, &n);
  i32 *a = (i32 *) calloc (n, sizeof (i32));
  i32 sum = 0;
  for (i32 i = 0; i < n; ++i) {
    scanf ("%" SCNi32, a + i);
    sum += a[i];
  }
  u32 *dp = (u32 *) calloc (sum + 1 + 300, sizeof (u32)) + 300;
  dp[0] = 1;
  for (i32 i = 0, s = 0; i < n; s += a[i++]) {
    for (i32 j = s + a[i]; j >= 0; --j) {
      dp[j] = 2 * dp[j] + dp[j - a[i]];
      while (dp[j] >= mod) dp[j] -= mod;
    }
  }
  u32 ans = mod_pow (3, n);
  for (i32 i = (sum + 1)/ 2; i <= sum; ++i) {
    ans = (ans + 3 * (mod - dp[i])) % mod;
  }
  if (sum % 2 == 0) {
    memset (dp, 0, sizeof (u32) * (sum + 1));
    dp[0] = 1;
    for (i32 i = 0, s = 0; i < n; s += a[i++]) {
      for (i32 j = s + a[i]; j >= 0; --j) {
	dp[j] += dp[j - a[i]];
	while (dp[j] >= mod) dp[j] -= mod;
      }
    }
    ans = (ans + 3 * dp[sum / 2]) % mod;
  }
  printf ("%" PRIu32 "\n", ans);
}

int main (void) {
  run();
  return 0;
}