#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int MOD = 1e9 + 7;
void add(int& a, int b) {
a += b;
if (a >= MOD) a -= MOD;
}
int n;
int a[21][21];
int dp[1 << 21]; // dp[mask] = Số hoán vị của tập hợp những bạn nữ có trong tập mask
// sao cho bắt cặp được với các bạn nam có chỉ số từ 0 đến |mask| - 1
// |mask| = số bit 1 hay số bạn nữ có trong tập mask
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) cin >> a[i][j];
}
dp[0] = 1;
for (int mask = 0; mask < (1 << n); mask++) {
// chỉ số của bạn nam hiện tại cần bắt cặp
int i = __builtin_popcount(mask);
for (int j = 0; j < n; j++) { // chỉ số của bạn nữ sẽ bắt cặp với bạn nam i
if ((mask >> j) & 1) continue;
if (!a[i][j]) continue;
int next_mask = mask | (1 << j);
add(dp[next_mask], dp[mask]);
}
}
cout << dp[(1 << n) - 1] << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7IAoKdm9pZCBhZGQoaW50JiBhLCBpbnQgYikgewoJYSArPSBiOyAKCWlmIChhID49IE1PRCkgYSAtPSBNT0Q7IAp9CgppbnQgbjsgCmludCBhWzIxXVsyMV07IAoKaW50IGRwWzEgPDwgMjFdOyAvLyBkcFttYXNrXSA9IFPhu5EgaG/DoW4gduG7iyBj4bunYSB04bqtcCBo4bujcCBuaOG7r25nIGLhuqFuIG7hu68gY8OzIHRyb25nIHThuq1wIG1hc2sgCgkJCQkgLy8gc2FvIGNobyBi4bqvdCBj4bq3cCDEkcaw4bujYyB24bubaSBjw6FjIGLhuqFuIG5hbSBjw7MgY2jhu4kgc+G7kSB04burIDAgxJHhur9uIHxtYXNrfCAtIDEKCQkJCSAvLyB8bWFza3wgPSBz4buRIGJpdCAxIGhheSBz4buRIGLhuqFuIG7hu68gY8OzIHRyb25nIHThuq1wIG1hc2sKCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBuOyAKCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkJZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIGNpbiA+PiBhW2ldW2pdOyAKCX0KCQoJZHBbMF0gPSAxOyAgCglmb3IgKGludCBtYXNrID0gMDsgbWFzayA8ICgxIDw8IG4pOyBtYXNrKyspIHsKCQkvLyBjaOG7iSBz4buRIGPhu6dhIGLhuqFuIG5hbSBoaeG7h24gdOG6oWkgY+G6p24gYuG6r3QgY+G6t3AKCQlpbnQgaSA9IF9fYnVpbHRpbl9wb3Bjb3VudChtYXNrKTsgCgkJZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsgLy8gY2jhu4kgc+G7kSBj4bunYSBi4bqhbiBu4buvIHPhur0gYuG6r3QgY+G6t3AgduG7m2kgYuG6oW4gbmFtIGkKCQkJaWYgKChtYXNrID4+IGopICYgMSkgY29udGludWU7IAoJCQlpZiAoIWFbaV1bal0pIGNvbnRpbnVlOyAKCQkJaW50IG5leHRfbWFzayA9IG1hc2sgfCAoMSA8PCBqKTsgCgkJCWFkZChkcFtuZXh0X21hc2tdLCBkcFttYXNrXSk7IAoJCX0KCX0KCgljb3V0IDw8IGRwWygxIDw8IG4pIC0gMV0gPDwgJ1xuJzsgCn0=