Language: C++

import java.io.*;
import java.util.*;

import static java.lang.Math.*;
import static java.util.Arrays.*;

// compression: i = #bits in mask
// https://atcoder.jp/contests/dp/submissions/16534633

class ac_dp_o_3 {}

class Main {

    public static void main(String[] args) throws IOException {
        int n = ri(), a[][] = new int[n][n], dp[] = new int[1 << n];
        for (int i = 0; i < n; ++i) {
            r();
            for (int j = 0; j < n; ++j) {
                a[i][j] = ni();
            }
        }
        dp[0] = 1;
        for (int mask = 0; mask < (1 << n) - 1; ++mask) {
            int i = Integer.bitCount(mask);
            for (int j = 0; j < n; ++j) {
                if (a[i][j] == 1 && (mask & (1 << j)) == 0) {
                    int next = mask | (1 << j);
                    dp[next] = (dp[next] + dp[mask]) % IBIG;
                }
            }
        }
        prln(dp[(1 << n) - 1]);
        close();
    }

    static BufferedReader __in = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter __out = new PrintWriter(new OutputStreamWriter(System.out));
    static StringTokenizer input;
    static Random __rand = new Random();

    // references
    // IBIG = 1e9 + 7
    // IMAX ~= 2e9
    // LMAX ~= 9e18

    // constants
    static final int IBIG = 1000000007;
    static final int IMAX = 2147483647;
    static final int IMIN = -2147483648;
    static final long LMAX = 9223372036854775807L;
    static final long LMIN = -9223372036854775808L;
    // math util
    static int minof(int a, int b, int c) {return min(a, min(b, c));}
    static int minof(int... x) {if (x.length == 1) return x[0]; if (x.length == 2) return min(x[0], x[1]); if (x.length == 3) return min(x[0], min(x[1], x[2])); int min = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] < min) min = x[i]; return min;}
    static long minof(long a, long b, long c) {return min(a, min(b, c));}
    static long minof(long... x) {if (x.length == 1) return x[0]; if (x.length == 2) return min(x[0], x[1]); if (x.length == 3) return min(x[0], min(x[1], x[2])); long min = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] < min) min = x[i]; return min;}
    static int maxof(int a, int b, int c) {return max(a, max(b, c));}
    static int maxof(int... x) {if (x.length == 1) return x[0]; if (x.length == 2) return max(x[0], x[1]); if (x.length == 3) return max(x[0], max(x[1], x[2])); int max = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] > max) max = x[i]; return max;}
    static long maxof(long a, long b, long c) {return max(a, max(b, c));}
    static long maxof(long... x) {if (x.length == 1) return x[0]; if (x.length == 2) return max(x[0], x[1]); if (x.length == 3) return max(x[0], max(x[1], x[2])); long max = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] > max) max = x[i]; return max;}
    static int powi(int a, int b) {if (a == 0) return 0; int ans = 1; while (b > 0) {if ((b & 1) > 0) ans *= a; a *= a; b >>= 1;} return ans;}
    static long powl(long a, int b) {if (a == 0) return 0; long ans = 1; while (b > 0) {if ((b & 1) > 0) ans *= a; a *= a; b >>= 1;} return ans;}
    static int fli(double d) {return (int) d;}
    static int cei(double d) {return (int) ceil(d);}
    static long fll(double d) {return (long) d;}
    static long cel(double d) {return (long) ceil(d);}
    static int gcf(int a, int b) {return b == 0 ? a : gcf(b, a % b);}
    static long gcf(long a, long b) {return b == 0 ? a : gcf(b, a % b);}
    static int lcm(int a, int b) {return a * b / gcf(a, b);}
    static long lcm(long a, long b) {return a * b / gcf(a, b);}
    static int randInt(int min, int max) {return __rand.nextInt(max - min + 1) + min;}
    static long mix(long x) {x += 0x9e3779b97f4a7c15L; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9L; x = (x ^ (x >> 27)) * 0x94d049bb133111ebL; return x ^ (x >> 31);}
    // array util
    static void reverse(int[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {int swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
    static void reverse(long[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {long swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
    static void reverse(double[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {double swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
    static void reverse(char[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {char swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
    static void shuffle(int[] a) {int n = a.length - 1; for (int i = 0; i < n; ++i) {int ind = randInt(i, n); int swap = a[i]; a[i] = a[ind]; a[ind] = swap;}}
    static void shuffle(long[] a) {int n = a.length - 1; for (int i = 0; i < n; ++i) {int ind = randInt(i, n); long swap = a[i]; a[i] = a[ind]; a[ind] = swap;}}
    static void shuffle(double[] a) {int n = a.length - 1; for (int i = 0; i < n; ++i) {int ind = randInt(i, n); double swap = a[i]; a[i] = a[ind]; a[ind] = swap;}}
    static void rsort(int[] a) {shuffle(a); sort(a);}
    static void rsort(long[] a) {shuffle(a); sort(a);}
    static void rsort(double[] a) {shuffle(a); sort(a);}
    static int[] copy(int[] a) {int[] ans = new int[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
    static long[] copy(long[] a) {long[] ans = new long[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
    static double[] copy(double[] a) {double[] ans = new double[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
    static char[] copy(char[] a) {char[] ans = new char[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
    // input
    static void r() throws IOException {input = new StringTokenizer(rline());}
    static int ri() throws IOException {return Integer.parseInt(rline());}
    static long rl() throws IOException {return Long.parseLong(rline());}
    static double rd() throws IOException {return Double.parseDouble(rline());}
    static int[] ria(int n) throws IOException {int[] a = new int[n]; r(); for (int i = 0; i < n; ++i) a[i] = ni(); return a;}
    static int[] riam1(int n) throws IOException {int[] a = new int[n]; r(); for (int i = 0; i < n; ++i) a[i] = ni() - 1; return a;}
    static long[] rla(int n) throws IOException {long[] a = new long[n]; r(); for (int i = 0; i < n; ++i) a[i] = nl(); return a;}
    static double[] rda(int n) throws IOException {double[] a = new double[n]; r(); for (int i = 0; i < n; ++i) a[i] = nd(); return a;}
    static char[] rcha() throws IOException {return rline().toCharArray();}
    static String rline() throws IOException {return __in.readLine();}
    static String n() {return input.nextToken();}
    static int rni() throws IOException {r(); return ni();}
    static int ni() {return Integer.parseInt(n());}
    static long rnl() throws IOException {r(); return nl();}
    static long nl() {return Long.parseLong(n());}
    static double rnd() throws IOException {r(); return nd();}
    static double nd() {return Double.parseDouble(n());}
    // output
    static void pr(int i) {__out.print(i);}
    static void prln(int i) {__out.println(i);}
    static void pr(long l) {__out.print(l);}
    static void prln(long l) {__out.println(l);}
    static void pr(double d) {__out.print(d);}
    static void prln(double d) {__out.println(d);}
    static void pr(char c) {__out.print(c);}
    static void prln(char c) {__out.println(c);}
    static void pr(char[] s) {__out.print(new String(s));}
    static void prln(char[] s) {__out.println(new String(s));}
    static void pr(String s) {__out.print(s);}
    static void prln(String s) {__out.println(s);}
    static void pr(Object o) {__out.print(o);}
    static void prln(Object o) {__out.println(o);}
    static void prln() {__out.println();}
    static void pryes() {prln("yes");}
    static void pry() {prln("Yes");}
    static void prY() {prln("YES");}
    static void prno() {prln("no");}
    static void prn() {prln("No");}
    static void prN() {prln("NO");}
    static boolean pryesno(boolean b) {prln(b ? "yes" : "no"); return b;};
    static boolean pryn(boolean b) {prln(b ? "Yes" : "No"); return b;}
    static boolean prYN(boolean b) {prln(b ? "YES" : "NO"); return b;}
    static void prln(int... a) {for (int i = 0, len = a.length - 1; i < len; pr(a[i]), pr(' '), ++i); if (a.length > 0) prln(a[a.length - 1]); else prln();}
    static void prln(long... a) {for (int i = 0, len = a.length - 1; i < len; pr(a[i]), pr(' '), ++i); if (a.length > 0) prln(a[a.length - 1]); else prln();}
    static void prln(double... a) {for (int i = 0, len = a.length - 1; i < len; pr(a[i]), pr(' '), ++i); if (a.length > 0) prln(a[a.length - 1]); else prln();}
    static <T> void prln(Collection<T> c) {int n = c.size() - 1; Iterator<T> iter = c.iterator(); for (int i = 0; i < n; pr(iter.next()), pr(' '), ++i); if (n >= 0) prln(iter.next()); else prln();}
    static void h() {prln("hlfd"); flush();}
    static void flush() {__out.flush();}
    static void close() {__out.close();}
}

Compiler output:
a.cc:51:31: warning: integer constant is so large that it is unsigned
   51 |     static final long LMIN = -9223372036854775808L;
      |                               ^~~~~~~~~~~~~~~~~~~~
a.cc:1:1: error: 'import' does not name a type
    1 | import java.io.*;
      | ^~~~~~
a.cc:1:1: note: C++20 'import' only available with '-fmodules-ts'
a.cc:2:1: error: 'import' does not name a type
    2 | import java.util.*;
      | ^~~~~~
a.cc:2:1: note: C++20 'import' only available with '-fmodules-ts'
a.cc:4:1: error: 'import' does not name a type
    4 | import static java.lang.Math.*;
      | ^~~~~~
a.cc:4:1: note: C++20 'import' only available with '-fmodules-ts'
a.cc:5:1: error: 'import' does not name a type
    5 | import static java.util.Arrays.*;
      | ^~~~~~
a.cc:5:1: note: C++20 'import' only available with '-fmodules-ts'
a.cc:10:19: error: expected ';' after class definition
   10 | class ac_dp_o_3 {}
      |                   ^
      |                   ;
a.cc:14:11: error: expected ':' before 'static'
   14 |     public static void main(String[] args) throws IOException {
      |           ^~~~~~~
      |           :
a.cc:14:29: error: 'String' has not been declared
   14 |     public static void main(String[] args) throws IOException {
      |                             ^~~~~~
a.cc:14:38: error: expected ',' or '...' before 'args'
   14 |     public static void main(String[] args) throws IOException {
      |                                      ^~~~
a.cc:14:42: error: expected ';' at end of member declaration
   14 |     public static void main(String[] args) throws IOException {
      |                                          ^
      |                                           ;
a.cc:14:44: error: 'throws' does not name a type
   14 |     public static void main(String[] args) throws IOException {
      |                                            ^~~~~~
a.cc:36:12: error: 'BufferedReader' does not name a type
   36 |     static BufferedReader __in = new BufferedReader(new InputStreamReader(System.in));
      |            ^~~~~~~~~~~~~~
a.cc:37:12: error: 'PrintWriter' does not name a type
   37 |     static PrintWriter __out = new PrintWriter(new OutputStreamWriter(System.out));
      |            ^~~~~~~~~~~
a.cc:38:12: error: 'StringTokenizer' does not name a type
   38 |     static StringTokenizer input;
      |            ^~~~~~~~~~~~~~~
a.cc:39:12: error: 'Random' does not name a type
   39 |     static Random __rand = new Random();
      |            ^~~~~~
a.cc:47:12: error: 'final' does not name a type
   47 |     static final int IBIG = 1000000007;
      |            ^~~~~
a.cc:48:12: error: 'final' does not name a type
   48 |     static final int IMAX = 2147483647;
      |            ^~~~~
a.cc:49:12: error: 'final' does not name a type
   49 |     static final int IMIN = -2147483648;
      |            ^~~~~
a.cc:50:12: error: 'final' does not name a type
   50 |     static final long LMAX = 9223372036854775807L;
      |            ^~~~~
a.cc:51:12: error: 'final' does not name a type
   51 |     static final long LMIN = -9223372036854775808L;
      |            ^~~~~
a.cc:54:29: error: expansion pattern 'int' contains no parameter packs
   54 |     static int minof(int... x) {if (x.length == 1) return x[0]; if (x.length == 2) return min(x[0], x[1]); if (x.length == 3) return min(x[0], min(x[1], x[2])); int min = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] < min) min = x[i]; return min;}
      |                             ^
a.cc:56:31: error: expansion pattern 'long int' contains no parameter packs
   56 |     static long minof(long... x) {if (x.length == 1) return x[0]; if (x.length == 2) return min(x[0], x[1]); if (x.length == 3) return min(x[0], min(x[1], x[2])); long min = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] < min) min = x[i]; return min;}
      |                               ^
a.cc:56:17: error: 'static long int Main::minof(...)' cannot be overloaded with 'static int Main::minof(...)'
   56 |     static long minof(long... x) {if (x.length == 1) return x[0]; if (x.length == 2) return min(x[0], x[1]); if (x.length == 3) return min(x[0], min(x[1], x[2])); long min = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] < min) min = x[i]; return min;}
      |                 ^~~~~
a.cc:54:16: note: previous declaration 'static int Main::minof(...)'
   54 |     static int minof(int... x) {if (x.length == 1) return x[0]; if (x.length == 2) return min(x[0], x[1]); if (x.length == 3) return min(x[0], min(x[1], x[2])); int min = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] < min) min = x[i]; return min;}
      |                ^~~~~
a.cc:58:29: error: expansion pattern 'int' contains no parameter packs
   58 |     static int maxof(int... x) {if (x.length == 1) return x[0]; if (x.length == 2) return max(x[0], x[1]); if (x.length == 3) return max(x[0], max(x[1], x[2])); int max = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] > max) max = x[i]; return max;}
      |                             ^
a.cc:60:31: error: expansion pattern 'long int' contains no parameter packs
   60 |     static long maxof(long... x) {if (x.length == 1) return x[0]; if (x.length == 2) return max(x[0], x[1]); if (x.length == 3) return max(x[0], max(x[1], x[2])); long max = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] > max) max = x[i]; return max;}
      |                               ^
a.cc:60:17: error: 'static long int Main::maxof(...)' cannot be overloaded with 'static int Main::maxof(...)'
   60 |     static long maxof(long... x) {if (x.length == 1) return x[0]; if (x.length == 2) return max(x[0], x[1]); if (x.length == 3) return max(x[0], max(x[1], x[2])); long max = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] > max) max = x[i]; return max;}
      |                 ^~~~~
a.cc:58:16: note: previous declaration 'static int Main::maxof(...)'
   58 |     static int maxof(int... x) {if (x.length == 1) return x[0]; if (x.length == 2) return max(x[0], x[1]); if (x.length == 3) return max(x[0], max(x[1], x[2])); int max = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] > max) max = x[i]; return max;}
      |                ^~~~~
a.cc:74:31: error: expected ',' or '...' before 'a'
   74 |     static void reverse(int[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {int swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
      |                               ^
a.cc:75:32: error: expected ',' or '...' before 'a'
   75 |     static void reverse(long[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {long swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
      |                                ^
a.cc:76:34: error: expected ',' or '...' before 'a'
   76 |     static void reverse(double[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {double swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
      |                                  ^
a.cc:77:32: error: expected ',' or '...' before 'a'
   77 |     static void reverse(char[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {char swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
      |                                ^
a.cc:78:31: error: expected ',' or '...' before 'a'
   78 |     static void shuffle(int[] a) {int n = a.length - 1; for (int i = 0; i < n; ++i) {int ind = randInt(i, n); int swap = a[i]; a[i] = a[ind]; a[ind] = swap;}}
      |                               ^
a.cc:79:32: error: expected ',' or '...' before 'a'
   79 |     static void shuffle(long[] a) {int n = a.length - 1; for (int i = 0; i < n; ++i) {int ind = randInt(i, n); long swap = a[i]; a[i] = a[ind]; a[ind] = swap;}}
      |                                ^
a.cc:80:34: error: expected ',' or '...' before 'a'
   80 |     static void shuffle(double[] a) {int n = a.length - 1; for (int i = 0; i < n; ++i) {int ind = randInt(i, n); double swap = a[i]; a[i] = a[ind]; a[ind] = swap;}}
      |                                  ^
a.cc:81:29: error: expected ',' or '...' before 'a'
   81 |     static void rsort(int[] a) {shuffle(a); sort(a);}
      |                             ^
a.cc:82:30: error: expected ',' or '...' before 'a'
   82 |     static void rsort(long[] a) {shuffle(a); sort(a);}
      |                              ^
a.cc:83:32: error: expected ',' or '...' before 'a'
   83 |     static void rsort(double[] a) {shuffle(a); sort(a);}
      |                                ^
a.cc:84:15: error: expected unqualified-id before '[' token
   84 |     static int[] copy(int[] a) {int[] ans = new int[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
      |               ^
a.cc:85:16: error: expected unqualified-id before '[' token
   85 |     static long[] copy(long[] a) {long[] ans = new long[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
      |                ^
a.cc:86:18: error: expected unqualified-id before '[' token
   86 |     static double[] copy(double[] a) {double[] ans = new double[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
      |                  ^
a.cc:87:16: error: expected unqualified-id before '[' token
   87 |     static char[] copy(char[] a) {char[] ans = new char[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
      |                ^
a.cc:89:19: error: expected ';' at end of member declaration
   89 |     static void r() throws IOException {input = new StringTokenizer(rline());}
      |                   ^
      |                    ;
a.cc:89:21: error: 'throws' does not name a type
   89 |     static void r() throws IOException {input = new StringTokenizer(rline());}
      |                     ^~~~~~
a.cc:90:19: error: expected ';' at end of member declaration
   90 |     static int ri() throws IOException {return Integer.parseInt(rline());}
      |                   ^
      |                    ;
a.cc:90:21: error: 'throws' does not name a type
   90 |     static int ri() throws IOException {return Integer.parseInt(rline());}
      |                     ^~~~~~
a.cc:91:20: error: expected ';' at end of member declaration
   91 |     static long rl() throws IOException {return Long.parseLong(rline