#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

const int N = 3e2 + 6, MOD = 998244353;
int n, m;
int Arr[N][N];

void swap_row (int l, int r) {
	for (int i = 0; i < m; i++)
		swap(Arr[l][i], Arr[r][i]);
}

void xor_row (int l, int r) {
	for (int i = 0; i < m; i++)
		Arr[r][i] ^= Arr[l][i];
}

int _sub (int a, int b) {
	int c = a - b;
	if (c < 0)
		c += MOD;
	return c;
}

int _mul (int a, int b) {
	int c = 1LL * a * b % MOD;
	return c;
}

int _pow (int a, int b) {
	int res = 1;
	for (; b; b >>= 1) {
		if (b & 1)
			res = _mul(res, a);
		a = _mul(a, a);
	}
	return res;
}

int main() {
	ios::sync_with_stdio(false), cin.tie(0);
	cin >> n >> m;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			cin >> Arr[i][j];

	int pointer = 0;
	for (int i = 0; i < m; i++) {
		int ind = -1;
		for (int j = pointer; j < n; j++)
			if (Arr[j][i])
				ind = j;

		if (ind == -1)
			continue;

		swap_row(pointer, ind);
		for (int j = pointer + 1; j < n; j++)
			if (Arr[j][i])
				xor_row(pointer, j);
		pointer++;
	}

	int num = 0;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			if (Arr[i][j]) {
				num++;
				break;
			}

	if (!num) {
		cout << "0\n";
		return 0;
	}

	int res = _mul(_sub(_pow(2, num), 1), _pow(2, n - num));
	cout << _mul(res, _pow(2, m - 1)) << "\n";
	return 0;
}
### Prompt

Please formulate a Cpp solution to the following problem:

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 <algorithm>
#include <iostream>
#include <vector>
using namespace std;

const int N = 3e2 + 6, MOD = 998244353;
int n, m;
int Arr[N][N];

void swap_row (int l, int r) {
	for (int i = 0; i < m; i++)
		swap(Arr[l][i], Arr[r][i]);
}

void xor_row (int l, int r) {
	for (int i = 0; i < m; i++)
		Arr[r][i] ^= Arr[l][i];
}

int _sub (int a, int b) {
	int c = a - b;
	if (c < 0)
		c += MOD;
	return c;
}

int _mul (int a, int b) {
	int c = 1LL * a * b % MOD;
	return c;
}

int _pow (int a, int b) {
	int res = 1;
	for (; b; b >>= 1) {
		if (b & 1)
			res = _mul(res, a);
		a = _mul(a, a);
	}
	return res;
}

int main() {
	ios::sync_with_stdio(false), cin.tie(0);
	cin >> n >> m;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			cin >> Arr[i][j];

	int pointer = 0;
	for (int i = 0; i < m; i++) {
		int ind = -1;
		for (int j = pointer; j < n; j++)
			if (Arr[j][i])
				ind = j;

		if (ind == -1)
			continue;

		swap_row(pointer, ind);
		for (int j = pointer + 1; j < n; j++)
			if (Arr[j][i])
				xor_row(pointer, j);
		pointer++;
	}

	int num = 0;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			if (Arr[i][j]) {
				num++;
				break;
			}

	if (!num) {
		cout << "0\n";
		return 0;
	}

	int res = _mul(_sub(_pow(2, num), 1), _pow(2, n - num));
	cout << _mul(res, _pow(2, m - 1)) << "\n";
	return 0;
}
```