pythondef solve(N, data):
FULLBIT = (1 << N) - 1
memo = [-1] * (1 << N)
def f(cursor, available):
if cursor == N:
return 1
ret = memo[available]
if ret != -1:
return ret
ret = 0
j = 0
m = available
while m:
if m & 1:
# available woman
if data[cursor * N + j]:
# acceptable
ret += f(cursor + 1, available ^ (1 << j))
j += 1
m //= 2
ret %= MOD
memo[available] = ret
return ret
return f(0, FULLBIT)