'''
状态压缩DP求解
'''M, N = map(int, input().split())
grid = [0] * M
for line_idx in range(M):arr = list(map(int, input().split()))for i, val in enumerate(arr):if val == 1:grid[line_idx] |= (1 << i)# dp(i, j) 表示前i行进行放置,最后一行的二进制状态是j的可能摆放次数
dp = [[0]*(1<<12) for _ in range(M)]# 一行中是否有相邻的1
def is_valid(val):cur_pos = -2for i in range(10):if val & (1 << i) != 0:if i == cur_pos + 1:return Falseelse:cur_pos = ireturn Truedef is_match(val, mask):for i in range(12):if (val & (1<<i)) != 0 and (mask & (1<<i)) == 0:return Falsereturn True# 先提前计算一行的状态能转换到的另外的一行状态
m = {val:[] for val in range(1<<N) }
for val in range(1 << N):for new_val in range(1 << N):if new_val & val == 0 and is_valid(new_val):m[val].append(new_val)for i in range(M):for j in range(1<<N):if is_valid(j) and is_match(j, grid[i]):if i == 0:dp[i][j] = 1else:for new_j in m[j]:dp[i][j] += dp[i-1][new_j]dp[i][j] %= 100000000else:dp[i][j] = 0print( sum(dp[M-1]) % 100000000)