#include using namespace std; #define ll long long #define pii pair #define pll pair #define fi first #define se second const int N = 16, M = 1 << 16; const int inf = 1e9, mod = 998244353; const ll INF = 1e18; int a[N][N]; ll f[N][M]; int ppc(int x){ return __builtin_popcount(x); } bool check(int m){ if (m == 0) return false; int k = ppc(m); return (k & (-k)) == k; } int get(int aa, int bb){ if (aa < bb) return a[aa][bb]; return -a[bb][aa]; } //int get(int aa, int bb){ // return a[min(aa, bb)][max(aa, bb)]; //} void init(){ } void solve(){ 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 ++ ) f[i][1 << i] = 1; for (int m = 0; m < (1 << 16); m ++ ){ if (!check(m)) continue; for (int l = m; l; l = (l - 1) & m){ if (ppc(l) != ppc(m) / 2) continue; int r = (m ^ l); if (l > r) continue; int qwq = l; while (qwq){ int lw = __lg(qwq & (-qwq)), pwp = r; while (pwp){ int rw = __lg(pwp & (-pwp)); if (get(lw, rw) == 1) f[lw][m] += 2 * f[lw][l] * f[rw][r]; else f[rw][m] += 2 * f[lw][l] * f[rw][r]; pwp -= (1 << rw); } qwq -= (1 << lw); } } } for (int i = 0; i < 16; i ++ ) cout << f[i][(1 << 16) - 1] << "\n"; } signed main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int T = 1; //cin >> T; while (T -- ) init(), solve(); } /* f[i][mask] 表示 i 在 mask 中胜出,其中 popcount(mask) = 2^k 样例咋不对啊。 哦我们 l vs r 和 r vs l 都会算 哦不对这确实是两个 卡卡常数,感觉跑的很慢啊。 首先我们 l vs r 和 r vs l 分开算,然后贡献 *2 我去快很多啊 拼一把 */