import sys from functools import lru_cache sys.setrecursionlimit(1 << 25) def main(): import sys N = int(sys.stdin.readline()) S = [] for _ in range(N): S.append(list(map(int, sys.stdin.readline().split()))) size = N log = size.bit_length() - 1 @lru_cache(maxsize=None) def dp(mask): participants = [i for i in range(N) if (mask & (1 << i))] m = len(participants) if m == 1: return {participants[0]: 1} half = m // 2 res = {} from itertools import combinations for left_indices in combinations(range(m), half): left = [] right = [] for i in range(m): if i in left_indices: left.append(participants[i]) else: right.append(participants[i]) left_mask = sum(1 << p for p in left) right_mask = sum(1 << p for p in right) left_dp = dp(left_mask) right_dp = dp(right_mask) for a in left_dp: for b in right_dp: if S[a][b] == 1: winner = a ways = left_dp[a] * right_dp[b] else: winner = b ways = left_dp[a] * right_dp[b] if winner not in res: res[winner] = 0 res[winner] += ways return res total = [0] * N for k in range(N): result = dp((1 << N) - 1) total[k] = result.get(k, 0) for k in range(N): print(total[k]) if __name__ == "__main__": main()