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)

#include <bits/stdc++.h>

using namespace std;

const int N = 302;
const int MOD = 998244353;

bitset<N>a[N];
int32_t main() {
    //ifstream cin("data.in");
    int n, m;
    cin >> n >> m;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            int x;
            cin >> x;
            a[i][j] = x;
        }
    }


    // n ecuatii cu m necunoscute, rezultatul e 0
    for(int i = 0; i < n; ++i) {
        a[i][m] = 0;
    }
    int l = 0, c = 0, var_free = 0;
    while(l < n && c < m) {
        int poz = -1;
        for(int i = l; i < n && poz == -1; i++)
            if(a[i][c] == 1)
                poz = i;
        if(poz == -1) {
            // n-am putut gasi, e deja 0
            c++;
            continue;
        }
        swap(a[l], a[poz]);
        for(int i = l + 1; i < n; ++i)
            if(a[i][c] == 1)
                a[i] ^= a[l];
        l++;
        c++;
    }

    for(int i=0;i<n;++i)
    {
        bool any=0;
        for(int j=0;j<m;++j)
        {
            if(a[i][j]) any = 1;
        }
        if(!any)var_free++;
    }


    vector<long long>p2(n + m + 1);
    p2[0] = 1;
    for(int i = 1; i <= n + m; ++i)
        p2[i] = 2 * p2[i - 1] % MOD;
    int aux1, aux2;

    aux1 = (p2[n] - 1 + MOD) % MOD, aux2 = p2[m - 1];
    int answer = (1LL * aux1 * aux2) % MOD;

    aux1 = (p2[var_free] - 1 + MOD) % MOD, aux2 = p2[m - 1];
    int bad = (1LL * aux1 * aux2) % MOD;
    answer = (answer - bad + MOD) % MOD;

    cout << answer;




}