Problem:
Score : 800 points

Problem Statement

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.

Sample Input 1

2 2
0 1
1 0

Sample Output 1

6

For example, if A consists of the first row and B consists of both columns, the sum of the numbers contained in the intersection is 0+1=1.

Sample Input 2

2 3
0 0 0
0 1 0

Sample Output 2

8

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

/*
    Take me to church
    I'll worship like a dog at the shrine of your lies
    I'll tell you my sins and you can sharpen your knife
    Offer me that deathless death
    Good God, let me give you my life
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 303, Mod = 998244353;
int n, m;
bitset < N > A[N];
inline int Power(int a, int b)
{
    int ret = 1;
    for (; b; b >>= 1, a = 1LL * a * a % Mod)
        if (b & 1) ret = 1LL * ret * a % Mod;
    return (ret);
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i ++)
        for (int j = 0, a; j < m; j ++)
            scanf("%d", &a), A[i][j] = a;
    int r = 0;
    for (int i = 0; i < m; i ++)
    {
        for (int j = r; j < n && A[r][i] == 0; j ++)
            if (A[j][i]) swap(A[r], A[j]);
        if (r < n && A[r][i])
        {
            for (int j = 0; j < n; j ++)
                if (r != j && A[j][i])
                    A[j] ^= A[r];
            r ++;
        }
    }
    return !printf("%d\n", (Power(2, n + m - 1) - Power(2, n - 1 + m - r) + Mod) % Mod);
}