
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <vector>
#include <iostream>
#include <map>
#include <set>
#include <algorithm>
#include <unordered_map>
#include <queue>
#include <sstream>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define SZ(x) (int)(x.size())
#define F0(i,n) for(int i=0;i<n;i++)
#define F1(i,n) for(int i=1;i<=n;i++)
#define CL(a,x) memset(x, a, sizeof(x));
#define P(x) cerr << #x << "=" << x << endl

const int MOD = 998244353;
const double pi = atan(1.0)*4.0;
const double eps = 1e-8;
ll gcd(ll x, ll y) { return y ? gcd(y, x%y) : x; }
int bc(int n) { return n ? bc((n-1)&n)+1 : 0; }

const int N = 301;
int i, j, k, m, n, rn, bn;
string s;
int a[N][N], b[N][N], used[N], ans2;
ll ans;

void add(int& x, int y) {
    x += y;
    if (x >= MOD) x -= MOD;
}

void solve() {
    F0(i, m) F0(j, n) cin >> a[i][j];

    int ind = 0;
    CL(0, used);
    F0(j, n) {
        F0(i, m) if (a[i][j] && !used[i]) {
            for (int k = i + 1; k < m; k++) if (a[k][j] && !used[k]) {
                F0(l, n) a[k][l] ^= a[i][l];
            }
            ind++;
            used[i] = 1;
            break;
        }
    }
    ans = 0;
    F0(i, ind) {
        ans = (ans * 2 + 1) % MOD;
    }
    F0(i, m - ind + n - 1) ans = (ans * 2) % MOD;
    cout << ans << endl;
}

int main() {
    //freopen("x.in", "r", stdin);
    while (cin >> m >> n) {
        solve();
    }
    return 0;
}

### Prompt

Your challenge is to write 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 <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <vector>
#include <iostream>
#include <map>
#include <set>
#include <algorithm>
#include <unordered_map>
#include <queue>
#include <sstream>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define SZ(x) (int)(x.size())
#define F0(i,n) for(int i=0;i<n;i++)
#define F1(i,n) for(int i=1;i<=n;i++)
#define CL(a,x) memset(x, a, sizeof(x));
#define P(x) cerr << #x << "=" << x << endl

const int MOD = 998244353;
const double pi = atan(1.0)*4.0;
const double eps = 1e-8;
ll gcd(ll x, ll y) { return y ? gcd(y, x%y) : x; }
int bc(int n) { return n ? bc((n-1)&n)+1 : 0; }

const int N = 301;
int i, j, k, m, n, rn, bn;
string s;
int a[N][N], b[N][N], used[N], ans2;
ll ans;

void add(int& x, int y) {
    x += y;
    if (x >= MOD) x -= MOD;
}

void solve() {
    F0(i, m) F0(j, n) cin >> a[i][j];

    int ind = 0;
    CL(0, used);
    F0(j, n) {
        F0(i, m) if (a[i][j] && !used[i]) {
            for (int k = i + 1; k < m; k++) if (a[k][j] && !used[k]) {
                F0(l, n) a[k][l] ^= a[i][l];
            }
            ind++;
            used[i] = 1;
            break;
        }
    }
    ans = 0;
    F0(i, ind) {
        ans = (ans * 2 + 1) % MOD;
    }
    F0(i, m - ind + n - 1) ans = (ans * 2) % MOD;
    cout << ans << endl;
}

int main() {
    //freopen("x.in", "r", stdin);
    while (cin >> m >> n) {
        solve();
    }
    return 0;
}

```