#include #include #include #include using namespace std; constexpr int fighters = 16; inline int to_bits(array const& bits) { int result = 0; for (int i = 0; i < fighters; i++) result |= bits[i] << i; return result; } array, fighters> dp; int main() { array, fighters> result; for (auto& row : result) for (auto& v : row) cin >> v; for (int i = 0; i < fighters; i++) for (int j = 0; j < i; j++) result[i][j] = -result[j][i]; for (auto& row : dp) for (auto& v : row) v = 0; for (int i = 0; i < fighters; i++) dp[i][1 << i] = 1; for (int i = 0; i <= 3; i++) { int high_digit = 1 << i; array a; vector b(fighters - high_digit); fill(rbegin(a), rbegin(a) + high_digit, 1); fill(rbegin(a) + high_digit, rend(a), 0); fill(rbegin(b), rbegin(b) + high_digit, 1); do { do { int n = to_bits(a), m = 0, b_idx = 0; for (int j = 0; j < fighters; j++) { if (n & (1 << j)) continue; m |= b[b_idx] << j; b_idx++; } for (int j = 0; j < fighters; j++) { for (int k = 0; k < fighters; k++) { if (j == k) continue; if (result[j][k] > 0) dp[j][n | m] += dp[j][n] * dp[k][m]; else dp[k][n | m] += dp[j][n] * dp[k][m]; } } } while (next_permutation(begin(a), end(a))); } while (next_permutation(begin(b), end(b))); } for (int i = 0; i < fighters; i++) cout << dp[i][(1 << 16) - 1] << endl; }