#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cctype>

#include <algorithm>
#include <functional>
#include <set>
#include <map>
#include <bitset>
#include <vector>
#include <iostream>
#include <limits>
#include <numeric>

#define LOG(FMT...) fprintf(stderr, FMT)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;

const int N = 310, P = 998244353;

int n, m;
bitset<N> bas[N];
bool vis[N];

int mpow(int x, int k, int p = P) {
  int ret = 1;
  while (k) {
    if (k & 1)
      ret = ret * (ll)x % p;
    x = x * (ll)x % p;
    k >>= 1;
  }
  return ret;
}

int main() {
#ifdef LBT
  freopen("test.in", "r", stdin);
  int nol_cl = clock();
#endif

  scanf("%d%d", &n, &m);
  int dim = 0;
  for (int i = 1; i <= n; ++i) {
    bitset<N> cur;
    for (int j = 1; j <= m; ++j) {
      int x;
      scanf("%d", &x);
      cur[j] = x;
    }
    for (int j = 1; j <= m; ++j)
      if (cur[j])
        if (!vis[j]) {
          bas[j] = cur;
          vis[j] = true;
          ++dim;
          break;
        } else
          cur ^= bas[j];
  }
  int ans = mpow(2, n + m - 1) - mpow(2, n - dim + m - 1);
  if (ans < 0)
    ans += P;
  printf("%d\n", ans);

#ifdef LBT
  LOG("Time: %dms\n", int ((clock()
          -nol_cl) / (double)CLOCKS_PER_SEC * 1000));
#endif
  return 0;
}

### Prompt

Your task is to create 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 <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cctype>

#include <algorithm>
#include <functional>
#include <set>
#include <map>
#include <bitset>
#include <vector>
#include <iostream>
#include <limits>
#include <numeric>

#define LOG(FMT...) fprintf(stderr, FMT)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;

const int N = 310, P = 998244353;

int n, m;
bitset<N> bas[N];
bool vis[N];

int mpow(int x, int k, int p = P) {
  int ret = 1;
  while (k) {
    if (k & 1)
      ret = ret * (ll)x % p;
    x = x * (ll)x % p;
    k >>= 1;
  }
  return ret;
}

int main() {
#ifdef LBT
  freopen("test.in", "r", stdin);
  int nol_cl = clock();
#endif

  scanf("%d%d", &n, &m);
  int dim = 0;
  for (int i = 1; i <= n; ++i) {
    bitset<N> cur;
    for (int j = 1; j <= m; ++j) {
      int x;
      scanf("%d", &x);
      cur[j] = x;
    }
    for (int j = 1; j <= m; ++j)
      if (cur[j])
        if (!vis[j]) {
          bas[j] = cur;
          vis[j] = true;
          ++dim;
          break;
        } else
          cur ^= bas[j];
  }
  int ans = mpow(2, n + m - 1) - mpow(2, n - dim + m - 1);
  if (ans < 0)
    ans += P;
  printf("%d\n", ans);

#ifdef LBT
  LOG("Time: %dms\n", int ((clock()
          -nol_cl) / (double)CLOCKS_PER_SEC * 1000));
#endif
  return 0;
}

```