#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cstdio>
#include <cmath>
#include <limits.h>
using namespace std;
typedef long long LL;
typedef bitset<305> BS;
const int B=305;
const int N=400;
const BS one=BS().set(0);
const BS zero=BS();
const LL M=998244353;

struct LB {
	int sz;
	BS b[B];

	void build(BS *a,int n) {
		sz=0;
		for(int i=0;i<B;i++) {
			b[i].reset();
		}
		for(int i=0;i<n;i++) {
			BS x=a[i];
			for(int j=B-1;j>=0;j--) {
				if(((x>>j)&one)==one) {
					if(b[j]!=zero) x^=b[j];
					else {
						b[j]=x;
						sz++;
						for(int k=j-1;k>=0;k--) {
							if(b[k]!=zero && ((b[j]>>k)&one)==one) b[j]^=b[k];
						}
						for(int k=j+1;k<B;k++) {
							if(((b[k]>>j)&one)==one) b[k]^=b[j];
						}
						break;
					}
				}
			}
		}
	}
}lb;

int n,m,b;
BS a[N];
LL dp[N],pw[N];

int main() {
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++) {
		a[i].reset();
		for(int j=0;j<m;j++) {
			scanf("%d",&b);
			if(b) a[i].set(j);
		}
	}
	lb.build(a,n);

	pw[0]=1;
	for(int i=1;i<N;i++) {
		pw[i]=pw[i-1]*2%M;
	}
	LL ans=(pw[lb.sz]-1+M)%M*pw[n-lb.sz]%M*pw[m-1]%M;
	printf("%lld\n",ans);
}
### Prompt

Please provide a Cpp coded solution to the problem described below:

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
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cstdio>
#include <cmath>
#include <limits.h>
using namespace std;
typedef long long LL;
typedef bitset<305> BS;
const int B=305;
const int N=400;
const BS one=BS().set(0);
const BS zero=BS();
const LL M=998244353;

struct LB {
	int sz;
	BS b[B];

	void build(BS *a,int n) {
		sz=0;
		for(int i=0;i<B;i++) {
			b[i].reset();
		}
		for(int i=0;i<n;i++) {
			BS x=a[i];
			for(int j=B-1;j>=0;j--) {
				if(((x>>j)&one)==one) {
					if(b[j]!=zero) x^=b[j];
					else {
						b[j]=x;
						sz++;
						for(int k=j-1;k>=0;k--) {
							if(b[k]!=zero && ((b[j]>>k)&one)==one) b[j]^=b[k];
						}
						for(int k=j+1;k<B;k++) {
							if(((b[k]>>j)&one)==one) b[k]^=b[j];
						}
						break;
					}
				}
			}
		}
	}
}lb;

int n,m,b;
BS a[N];
LL dp[N],pw[N];

int main() {
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++) {
		a[i].reset();
		for(int j=0;j<m;j++) {
			scanf("%d",&b);
			if(b) a[i].set(j);
		}
	}
	lb.build(a,n);

	pw[0]=1;
	for(int i=1;i<N;i++) {
		pw[i]=pw[i-1]*2%M;
	}
	LL ans=(pw[lb.sz]-1+M)%M*pw[n-lb.sz]%M*pw[m-1]%M;
	printf("%lld\n",ans);
}
```