#include <bits/stdc++.h>
using namespace std;

template<typename T>
void chmax(T &a,T b){
  if(a<b)a=b;
}
struct maxhist{
  vector<int> hist;
  struct rect{int height,idx;};

  void add_hist(int a){
    hist.push_back(a);
  }

  int get_max(){
    int res=0;
    stack<rect> s;
    for(int j=0;j<hist.size();j++){
      if((!s.size())||s.top().height<hist[j])s.push({hist[j],j});
      else if(s.top().height>hist[j]){
        int left;
        while(s.top().height>hist[j]){
          rect tmp=s.top();s.pop();
          left=tmp.idx;
          //chmax(res,tmp.height*(j-left));
          chmax(res,(tmp.height+1)*(j-left+1));
          if(!s.size())break;
        }
        s.push({hist[j],left});
      }
    }
    while(s.size()){
      rect tmp=s.top();s.pop();
      //chmax(res,tmp.height*(hist.size()-tmp.idx));
      chmax(res,(tmp.height+1)*((int)hist.size()-tmp.idx+1));
    }
    return res;
  }
};
struct maxrect{
  vector<vector<bool>> rect;

  void add_line(vector<bool> &v){
    rect.push_back(v);
  }
  void add_dot(int h,bool f){
    if(rect.size()<=h)rect.resize(h+1);
    rect[h].push_back(f);
  }

  int get_max(){
    int res=0;
    int h=rect.size();
    vector<vector<int>> hist(h);
    for(int i=0;i<h;i++)hist[i].resize(rect[i].size());
    for(int i=0;i<h;i++){
      maxhist mh;
      for(int j=0;j<hist[i].size();j++){
        if(i){
          if(hist[i-1].size()<=j)hist[i][j]=rect[i][j];
          else hist[i][j]=(hist[i-1][j]+rect[i][j])*rect[i][j];
        }
        else hist[i][j]=rect[i][j];
        mh.add_hist(hist[i][j]);
      }
      chmax(res,mh.get_max());
    }
    return res;
  }
};

signed main(){
  int h,w;cin>>h>>w;
  vector<string> s(h);
  for(int i=0;i<h;i++)cin>>s[i];
  maxrect m;
  vector<bool> f(w-1);
  for(int i=1;i<h;i++){
    for(int j=0;j<w-1;j++){
      int a=(s[i-1][j]=='#')+(s[i-1][j+1]=='#')+(s[i][j]=='#')+(s[i][j+1]=='#');
      f[j]=(a&1)^1;
    }
    m.add_line(f);
  }
  cout<<max({h,w,m.get_max()})<<endl;
}

/*
解説AC
広義唐草模様の面積求めたくなって、どこがダメな場所かも分かったけど最大長方形のアルゴリズムを知らず
時間かければ自分で思いつきそうな気もするけどコスパ悪いし見ていいでしょ
面白かった
*/

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=998244353;
int dp[4][310*310],a[310];
inline int add_mod(int x){
	return x<mod?x:x-mod;
}
int main(){
	int n,ret=1,sum=0,minus=1;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",a+i);
		ret=(ll)ret*3%mod;
		minus=add_mod(minus+minus);
		sum+=a[i];
	}
	ret=add_mod(ret+mod-3);
	minus=add_mod(minus+mod-2);
	ret=add_mod(ret+mod-(ll)minus*3%mod);
	memset(dp,0,sizeof dp);
	dp[0][0]=1;
	for(int i=1;i<=n;i++){
		for(int j=sum;j>=a[i];j--){
			for(int s=0;s<4;s++){
				dp[s|1][j]=add_mod(dp[s|1][j]+dp[s][j-a[i]]);
				dp[s|2][j]=add_mod(dp[s|2][j]+dp[s][j-a[i]]);
			}
		}
	}
	for(int i=1;i+i<=sum;i++)
		ret=add_mod(ret+mod-(ll)dp[3][i]*3%mod);
	printf("%d\n",ret);
	return 0;
}