import sys from collections import Counter input = sys.stdin.readline def read_values(): return map(int, input().split()) def read_list(): return list(read_values()) mod=998244353 pre_prod = [[0] * 256 for _ in range(256)] pre_inv = [0] * 256 def nim_product(a,b,d=6): if min(a,b) <= 1: return a*b if a < 256 and b < 256 and pre_prod[a][b]: return pre_prod[a][b] d -= 1 d_pow = 1 << d d_pow_pow = 1 << d_pow if a < d_pow_pow and b < d_pow_pow: return nim_product(a,b,d) au = a >> d_pow al = a - (au << d_pow) bu = b >> d_pow bl = b - (bu << d_pow) aubu = nim_product(au,bu,d) ablu = nim_product(au^al,bu^bl,d) albl = nim_product(al,bl,d) res = ((albl ^ ablu) << d_pow) ^ (nim_product(aubu, d_pow_pow // 2, d)) ^ (albl) if a < 256 and b < 256: pre_prod[a][b] = res pre_prod[b][a] = res return res def nim_product_inv(a,d=6): if a<256: return pre_inv[a] d -= 1 d_pow = 1 << d if a < (1<> d_pow al = a - (au << d_pow) half_inv = nim_product_inv(nim_product(au ^ al, al, d) ^ nim_product(nim_product(au, au, d), 1 << (d_pow - 1)), d) return (nim_product(half_inv, au, d) << d_pow) ^ nim_product(half_inv, au ^ al, d) def main(): for a in range(1,256): for b in range(1,256): c = nim_product(a,b) if c==1: pre_inv[a]=b pre_inv[b]=a n,t=read_values() h=list() for i in range(t): h.append(read_list()) h[-1] = [v-1 for v in h[-1]] use=[-1]*t for c0 in range(n-1,-1,-1): for r in range(t): if h[r][c0]==0 or use[r] != -1: continue use[r]=c0 r0=r break else: continue inv = nim_product_inv(h[r0][c0]) h[r0] = [nim_product(v,inv) for v in h[r0]] for r in range(t): if r == r0: continue for c in range(n): h[r][c] ^= nim_product(h[r0][c],h[r][c0]) base_a = [[0] * n for _ in range(n)] for i in range(t): if use[i] != -1: base_a[use[i]] = h[i] ans=0 mul=pow(2,64,mod) def dfs(a, add, pop, column): nonlocal ans if column < 0: if pop%2: ans-=add else: ans+=add ans%=mod return a0=[r[:column] for r in a[:column]] add0=add if a[-1][-1]==0: add0*=mul add0%=mod dfs(a0,add0,pop,column-1) for c0 in range(column-1,-1,-1): if a[-1][c0]: ainv = nim_product_inv(a[-1][c0]) ar=[nim_product(ainv,m) for m in a[-1]] for r in range(column): for c in range(column): if r==c0: if a0[r][c0] != ar[c0]: a0[r][c] ^= ar[c] else: a0[r][c] ^= nim_product(ar[c], a0[r][c0]) break dfs(a0,add,pop+1,column-1) dfs(base_a,1,0,n-1) print(ans%mod) if __name__ == "__main__": main()