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: Wrong Answer)

#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <fstream>
#include <sstream>
#include <iomanip>

using namespace std;

long long MOD = 998244353;

long long power(int x){
    long long ret=1;
    for(int i=0; i<x; i++){
        ret*=3;
        ret%=MOD;
    }
    return ret;
}

int main(){
    int N;
    cin >> N;
    vector<int> a(N,0);
    vector<int> sumA(N+1,0);
    for(int i=0; i<N; i++){
        cin >> a[i];
        sumA[i+1]=sumA[i]+a[i];
    }
    vector<vector<long long> > dp(301,vector<long long>(90001,0));
    dp[0][0]=1;
    long long ans =0;
    for(int i=0; i<N; i++){
        for(int j=0; j<=min(sumA[N]/2,sumA[i]); j++){
            int tmp=j+a[i];
            if(j==sumA[N]/2 and sumA[N]%2==0)continue;
            dp[i+1][tmp]+=dp[i][j];
            dp[i+1][j]+=2*dp[i][j];
            if(tmp>sumA[N]/2){
                ans+=dp[i+1][tmp]*power(N-i-1);
                ans%=MOD;
            }else if(sumA[N]%2==0 and tmp==sumA[N]/2){
                ans+=dp[i+1][tmp]*power(N-i-1);
                ans%=MOD;
            }
        }
    }

    if(sumA[N]%2==1){
        ans*=3;
        ans%=MOD;
        ans=power(N)-ans;
        ans%=MOD;
        if(ans<0){
            ans+=MOD;
        }
        cout << ans << endl;
        return 0;
    }

    vector<vector<long long> > dp2(301,vector<long long>(90001,0));
    dp2[0][0]=1;
    for(int i=0; i<N; i++){
        for(int j=0; j<=min(sumA[N]/2,sumA[i]); j++){
            int tmp=j+a[i];
            dp2[i+1][tmp]+=dp2[i][j];
            dp2[i+1][j]+=dp2[i][j];
            if(tmp==sumA[N]/2){
                ans-=dp2[i+1][tmp];
                ans%=MOD;
            }
        }
    }

    ans*=3;
    ans%=MOD;
    ans=power(N)-ans;
    ans%=MOD;
    if(ans<0){
        ans+=MOD;
    }
    cout << ans << endl;
}