/* --- author: dxm --- */
#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;

#define INF 1e9
#define Inf 1e18
#define rep(i,n) for(int (i)=0;(i)<n;i++)
#define REP(i,n) for(int (i)=1;(i)<=n;i++)
#define mp make_pair
#define pb push_back
#define fst first
#define snd second
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<long long,long long> pll;

void qread(int &x){
	int neg=1;x=0;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')neg=-1;c=getchar();}
	while(c>='0'&&c<='9')x=10*x+c-'0',c=getchar();
	x*=neg;
}

const int maxn=305;
const int mod=998244353;
int n,m;
int a[maxn][maxn],pw[maxn*2];

int gauss(){
	int r=1,res=0;
	REP(i,m){
		int j=r;
		while(j<=n&&!a[j][i])j++;
		if(j>n){
			res++;
			continue;
		}
		if(j!=r){
			REP(k,m)swap(a[j][k],a[r][k]);
		}
		for(int j=r+1;j<=n;j++)if(a[j][i]){
			for(int k=i;k<=m;k++)a[j][k]^=a[r][k];
		}
		r++;
	}
	return res;
}

int main(){
#ifdef FILE
	freopen("FILE.in","r",stdin);
	freopen("FILE.out","w",stdout);
#endif
	scanf("%d%d",&n,&m);
	pw[0]=1;
	REP(i,n+m)pw[i]=2LL*pw[i-1]%mod;
	REP(i,n)REP(j,m)scanf("%d",&a[i][j]);
	int ans=(pw[n+m-1]-pw[n+gauss()-1]+mod)%mod;
	printf("%d\n",ans);
#ifdef TIME
	printf("Running Time = %d ms\n",int(clock()*1000.0/CLOCKS_PER_SEC));
#endif
	return 0;
}

/*
Input:
-----------------
Output:
*/

### Prompt

Construct a Cpp code solution to the problem outlined:

There is a square grid with N rows and M columns. Each square contains an integer: 0 or 1. The square at the i-th row from the top and the j-th column from the left contains a_{ij}.

Among the 2^{N+M} possible pairs of a subset A of the rows and a subset B of the columns, find the number of the pairs that satisfy the following condition, modulo 998244353:

* The sum of the |A||B| numbers contained in the intersection of the rows belonging to A and the columns belonging to B, is odd.

Constraints

* 1 \leq N,M \leq 300
* 0 \leq a_{i,j} \leq 1(1\leq i\leq N,1\leq j\leq M)
* All values in input are integers.

Input

Input is given from Standard Input in the following format:


N M
a_{11} ... a_{1M}
:
a_{N1} ... a_{NM}


Output

Print the number of the pairs of a subset of the rows and a subset of the columns that satisfy the condition, modulo 998244353.

Examples

Input

2 2
0 1
1 0


Output

6


Input

2 3
0 0 0
0 1 0


Output

8

### Response

```cpp
/* --- author: dxm --- */
#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;

#define INF 1e9
#define Inf 1e18
#define rep(i,n) for(int (i)=0;(i)<n;i++)
#define REP(i,n) for(int (i)=1;(i)<=n;i++)
#define mp make_pair
#define pb push_back
#define fst first
#define snd second
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<long long,long long> pll;

void qread(int &x){
	int neg=1;x=0;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')neg=-1;c=getchar();}
	while(c>='0'&&c<='9')x=10*x+c-'0',c=getchar();
	x*=neg;
}

const int maxn=305;
const int mod=998244353;
int n,m;
int a[maxn][maxn],pw[maxn*2];

int gauss(){
	int r=1,res=0;
	REP(i,m){
		int j=r;
		while(j<=n&&!a[j][i])j++;
		if(j>n){
			res++;
			continue;
		}
		if(j!=r){
			REP(k,m)swap(a[j][k],a[r][k]);
		}
		for(int j=r+1;j<=n;j++)if(a[j][i]){
			for(int k=i;k<=m;k++)a[j][k]^=a[r][k];
		}
		r++;
	}
	return res;
}

int main(){
#ifdef FILE
	freopen("FILE.in","r",stdin);
	freopen("FILE.out","w",stdout);
#endif
	scanf("%d%d",&n,&m);
	pw[0]=1;
	REP(i,n+m)pw[i]=2LL*pw[i-1]%mod;
	REP(i,n)REP(j,m)scanf("%d",&a[i][j]);
	int ans=(pw[n+m-1]-pw[n+gauss()-1]+mod)%mod;
	printf("%d\n",ans);
#ifdef TIME
	printf("Running Time = %d ms\n",int(clock()*1000.0/CLOCKS_PER_SEC));
#endif
	return 0;
}

/*
Input:
-----------------
Output:
*/

```