import sys def main(): n, B = map(int, sys.stdin.readline().split()) A = [list(map(int, sys.stdin.readline().split())) for _ in range(n)] mod = 2 * B # Compute permanent using Ryser's algorithm with mod popcount = [bin(m).count('1') for m in range(1 << n)] permanent = 0 for mask in range(1 << n): k = popcount[mask] sign = (-1) ** (n - k) product = 1 for i in range(n): sum_i = 0 temp = mask while temp: lsb = temp & -temp j = (lsb.bit_length() - 1) sum_i += A[i][j] temp ^= lsb sum_i %= mod product = (product * sum_i) % mod term = sign * product permanent = (permanent + term) % mod # Compute determinant using Gaussian elimination matrix = [row.copy() for row in A] det = 1 for i in range(n): pivot = -1 for j in range(i, n): if matrix[j][i] % mod != 0: pivot = j break if pivot == -1: det = 0 break if pivot != i: matrix[i], matrix[pivot] = matrix[pivot], matrix[i] det = (-det) % mod for j in range(i + 1, n): while True: current = matrix[j][i] % mod if current == 0: break # Use the row with the larger leading coefficient to reduce if matrix[i][i] % mod == 0: matrix[i], matrix[j] = matrix[j], matrix[i] det = (-det) % mod continue factor = (current * pow(matrix[i][i], -1, mod)) % mod if matrix[i][i] != 0 else 0 if factor == 0: break for k in range(i, n): matrix[j][k] = (matrix[j][k] - factor * matrix[i][k]) % mod # Check again after subtraction current = matrix[j][i] % mod if current != 0: matrix[i], matrix[j] = matrix[j], matrix[i] det = (-det) % mod else: break det = (det * matrix[i][i]) % mod m = (permanent - det) % mod ans = (m // 2) % B print(ans) if __name__ == "__main__": main()