\(\color{green}{solution}\)
子集\(\rm dp\)第一题
/**************************************************************
Problem: 2560
User: MiEcoku
Language: C++
Result: Accepted
Time:1816 ms
Memory:2568 kb
****************************************************************/
#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) (x & -x)
typedef long long ll;
const int maxn = 1 << 16, mod = 1e9 + 7;
int C[21][21], idpos[maxn], n;
ll g[maxn], f[maxn];
int main() {
scanf("%d", &n);
for ( register int i = 1; i <= 16; ++ i) idpos[1 << i-1] = i;
for ( register int i = 1; i <= n; ++ i)
for ( register int k = 1; k <= n; ++ k) scanf("%d", &C[i][k]);
for ( register int s = 1; s < 1 << n; ++ s) {
g[s] = 1;
for ( register int i = s; i; i -= lowbit(i)) {
for ( register int k = s; k; k -= lowbit(k)) {
if( lowbit(i) < lowbit(k)) {
g[s] = g[s] * (C[idpos[lowbit(i)]][idpos[lowbit(k)]] + 1) % mod;
}
}
}
f[s] = g[s]; int o = s - lowbit(s);
for ( register int i = o; i; i = (i - 1) & o) {
(f[s] += mod - g[i] * f[s^i] % mod) %= mod;
}
}
printf("%lld\n", f[(1 << n)-1]);
return 0;
}