#include #include #include #include #include #include #include #include #include #include using namespace std; #define int long long int MOD = 1000000007; int dp[1 << 16]; int A[16][16]; int sz = 0; vector loser; vector winner; int z = 0; int xx; int Y[16]; void dfs(int a) { if (a == (int)winner.size()) { dp[xx] += dp[z]; } else { for (int k = 0; k < loser.size(); k++) { if (Y[loser[k]] == 1) { if (A[winner[a]][loser[k]] == 1) { Y[loser[k]] = 0; z |= (1 << loser[k]); dfs(a + 1); Y[loser[k]] = 1; z ^= (1 << loser[k]); } } } } } int C(int x) { winner.clear(); loser.clear(); for (int i = 0; i < 16; i++) { if (x & (1 << i)) { winner.push_back(i); Y[i] = 0; } else { loser.push_back(i); Y[i] = 1; } } z = x; xx = x; dfs(0); } signed main() { cin.tie(0); ios::sync_with_stdio(false); int res = 0; for (int i = 0; i < 16; i++) { for (int j = 0; j < 16; j++) { cin >> A[i][j]; } } for (int i = 0; i < 16; i++) { for (int j = 0; j < 16; j++) { if (i > j) { A[i][j] = -A[j][i]; } } } dp[(1 << 16) - 1] = (1 << 15); for (int j = 0; j < 4; j++) { int k = (8 >> j); //cerr << k << endl; for (int x = (1 << k) - 1; x < (1 << 16); ) { C(x); int t = x | (x - 1); x = (t + 1) | (((~t & -~t) - 1) >> (__builtin_ctz(x) + 1)); } } for (int i = 0; i < 16; i++) { cout << dp[1 << i] << endl; } }