#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;

#define REP(i,x) for(int i=0;i<(int)(x);i++)
#define REPS(i,x) for(int i=1;i<=(int)(x);i++)
#define RREP(i,x) for(int i=((int)(x)-1);i>=0;i--)
#define RREPS(i,x) for(int i=((int)(x));i>0;i--)
#define FOR(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();i++)
#define RFOR(i,c) for(__typeof((c).rbegin())i=(c).rbegin();i!=(c).rend();i++)
#define ALL(container) (container).begin(), (container).end()
#define RALL(container) (container).rbegin(), (container).rend()
#define SZ(container) ((int)container.size())
#define mp(a,b) make_pair(a, b)
#define pb push_back
#define eb emplace_back
#define UNIQUE(v) v.erase( unique(v.begin(), v.end()), v.end() );
#define __builtin_popcount __builtin_popcountll
#define endl '\n'

template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }
template<class T> ostream& operator<<(ostream &os, const vector<T> &t) {
    os<<"["; FOR(it,t) {if(it!=t.begin()) os<<","; os<<*it;} os<<"]"; return os;
}
template<class T> ostream& operator<<(ostream &os, const set<T> &t) {
    os<<"{"; FOR(it,t) {if(it!=t.begin()) os<<","; os<<*it;} os<<"}"; return os;
}
template<class S, class T> ostream& operator<<(ostream &os, const map<S, T> &t) {
    os<<"{"; FOR(it,t) {if(it!=t.begin()) os<<","; os<<*it;} os<<"}"; return os;
}
template<class S, class T> ostream& operator<<(ostream &os, const pair<S,T> &t) { return os<<"("<<t.first<<","<<t.second<<")";}
template<class S, class T> pair<S,T> operator+(const pair<S,T> &s, const pair<S,T> &t){ return pair<S,T>(s.first+t.first, s.second+t.second);}
template<class S, class T> pair<S,T> operator-(const pair<S,T> &s, const pair<S,T> &t){ return pair<S,T>(s.first-t.first, s.second-t.second);}

const int INF = 1<<28;
const double EPS = 1e-8;
const int MOD = 998244353;

typedef vector<unsigned int> Array;
typedef vector<Array> Matrix;

Matrix mul(const Matrix &a,const Matrix &b){
    Matrix res(a.size(),Array(b[0].size()));
    REP(i,a.size())
        REP(j,b[0].size())
            REP(k,a[0].size())
                res[i][j] ^= a[i][k] & b[k][j];
    return res;
}

Matrix pow(const Matrix &a,int b){
    if(b==0){
        Matrix res(a.size(),Array(a.size()));
        REP(i,a.size()) res[i][i]=-1;
        return res;
    }
    Matrix res=pow(mul(a,a),b/2);
    if(b&1)res=mul(res,a);
    return res;
}

int rankk(Matrix M){
    int N = M.size();
    int W = M[0].size();
    int ret = 0;
    int j = 0;
    for(int i=0;i<N;i++){
        int ma=i;
        for(int k=i;k<N;k++) if(M[ma] < M[k]) ma = k;
        swap(M[i], M[ma]);
        for(;!M[i][j]&&j<W;j++);
        if(W<=j) return ret;
        for(int k=i+1;k<N;k++)
            if(M[k][j])
                for(int l=j;l<W;l++) M[k][l] ^= M[i][l];
        ret ++;
    }
    return ret;
}

template<int N, int MOD>
struct Comb{
    ll fact[N+1], inv[N+1];
    Comb(){
        fact[0] = inv[0] = inv[1] = 1;
        for(int i=2;i<=N;i++) inv[i] = (MOD+((ll)-inv[MOD%i]*(MOD/i))%MOD)%MOD;
        REPS(i, N){
            fact[i] = fact[i-1]*i%MOD;
            inv[i] = inv[i]*inv[i-1]%MOD;
        }
    }
    ll operator()(int n, int r){
        if(n < 0 || r < 0 || r > n) return 0;
        ll res = inv[r]*inv[n-r];
        if(res >= MOD) res%= MOD;
        res *= fact[n];
        if(res >= MOD) res%= MOD;
        return res;
    }
};
Comb<300000, MOD> C;

ll modpow(ll x, ll y){
    ll r = 1, a = x % MOD;
    while(y > 0){
        if((y&1) == 1) r = (r*a) % MOD;
        a = (a*a) % MOD;
        y /= 2;
    }
    return r;
}

int T, n, m;

int main(int argc, char *argv[]){
    ios::sync_with_stdio(false);
    while(cin >> n >> m){
        Matrix mat(n, Array(m));
        REP(i, n) {
            REP(j, m) {
                cin >> mat[i][j];
            }
        }
        int r = rankk(mat);
        ll ans = 0;
        REPS(i, r) {
            ans += modpow(2, n - 1) * C(r, i) % MOD * modpow(2, m - r) % MOD;
            ans %= MOD;
        }
        cout << ans % MOD << endl;
    }
    return 0;
}


Measured memory_bytes: 5632