mod = 2 def inplace_sweep(n: int, m: int, a): # returns [is pivot] piv = [False] * m r = 0 for j in range(m): if a[r][j] == 0: for i in range(r + 1, n): if a[i][j]: a[r], a[i] = a[i], a[r] break if a[r][j] == 0: continue inv = pow(a[r][j], -1, mod) a[r] = [e * inv % mod for e in a[r]] ar = a[r] for i in range(n): c = a[i][j] if i == r or c == 0: continue a[i] = [(e - c * er) % mod for e, er in zip(a[i], ar)] piv[j] = True r += 1 if r == n: break return piv def solve_linear_equation(n: int, m: int, a, b): """returns (x0, rank, ker basis) | None""" if n == 0: es = [[0] * m for _ in range(m)] for i in range(m): es[i][i] = 1 return [], m, es exa = [[e % mod for e in ai] + [bi % mod] for ai, bi in zip(a, b)] is_piv = inplace_sweep(n, m + 1, exa) r = sum(is_piv) if r == 0: es = [[0] * m for _ in range(m)] for i in range(m): es[i][i] = 1 return [0] * m, m, es if is_piv[m]: return None piv = [i for i in range(m) if is_piv[i]] un_piv = [i for i in range(m) if not is_piv[i]] x0 = [0] * m for i, p in enumerate(piv): x0[p] = exa[i][m] es = [[0] * m for _ in range(m - r)] for i, p in enumerate(piv): row = exa[i] for j, up in enumerate(un_piv): es[j][p] = mod - row[up] if row[up] else 0 for i, p in enumerate(un_piv): es[i][p] = 1 return x0, m - r, es def main(): from sys import stdin def input(): return stdin.readline().rstrip("\n") n, m, k = map(int, input().split()) a = [tuple(map(int, input())) for _ in range(n)] b = [0] * m ans = solve_linear_equation(m, n, a, b) if ans is None: print(0) return x0, r, es = ans print(pow(2, r, k)) if __name__ == "__main__": main()