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<algorithm>
#include<vector>
#include<queue>
#include<string>
using namespace std;
typedef long long ll;
ll dp[305][90005]={0};
ll dp2[305][90005]={0};
const ll mod=998244353;
ll pow(ll x,ll y){
  if(y==0) return 1;
  ll ret=pow(x,y/2);
  ret*=ret;
  ret%=mod;
  if(y%2==1) ret*=x;
  return ret%mod;
}
int main(){
  ll n,sum=0;
  cin>>n;
  ll array[305]={0};
  for(ll i=1;i<=n;i++){
    cin>>array[i];
    sum+=array[i];
  }
  for(ll i=1;i<=n;i++){
    if(array[i]>=(sum+1)/2){
      cout<<0<<endl;
      return 0;
    }
  }
  const ll ferm=pow(2,mod-2);
  //cout<<ferm<<endl;
  for(ll i=0;i<n;i++){
    dp[i+1][array[i+1]]+=pow(2,n-1);
    dp2[i+1][array[i+1]]++;
    for(ll j=0;j<90005;j++){
      dp[i+1][j]+=dp[i][j];
      dp[i+1][j]%=mod;
      dp[i+1][j+array[i+1]]+=dp[i][j]*ferm;
      dp[i+1][j+array[i+1]]%=mod;

      dp2[i+1][j]+=dp2[i][j];
      dp2[i+1][j+array[i+1]]+=dp2[i][j];
    }
  }
  ll ans=pow(3,n);
  for(ll i=(1+sum)/2;i<90005;i++) {
    ans-=dp[n][i]*3;
    if(ans<0){
      while(ans<0) ans+=mod;
    }
    ans%=mod;
  }
//  cout<<ans<<endl;
  if(sum%2==0){
   ans+=dp2[n][sum/2]*3;
   ans%=mod;
  }
  if(ans<0){
    while(ans<0) ans+=mod;
  }
  ans%=mod;
  /*for(int i=0;i<=n;i++){
    for(int j=0;j<5;j++) cout<<dp[i][j]<<" ";
    cout<<endl;
  }*/
  if(sum%2!=0)cout<<ans<<endl;
  else cout<<-1<<endl;
}