func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 25, M = 300005;   int n, a[N][N];   long long f[M], g[N][M], d[N][M], dp[N][M];   map<long long, long long> mp;   string st;   inline int bp(int x) { return __builtin_popcount(x); }   void dfs(int p, int s, int x, long long m) {     if (s == n) {       long long w = 0;       for (int i = 0; i < (1 << n); i++) {         if ((n + bp(i)) & 1)           w -= d[x][i];         else           w += d[x][i];       }       mp[m] = w;       return;     }     if (s + p > n) return;     for (int i = 0; i < (1 << n); i++) d[x + 1][i] = d[x][i] * g[p][i];     dfs(p, s + p, x + 1, m * 10 + p);     dfs(p + 1, s, x, m);   }   long long ch(int x) {     vector<int> v;     int s = 0;     for (int i = 0; i < n; i++) {       if (x >> i & 1)         s++;       else {         v.push_back(s + 1);         s = 0;       }     }     sort(v.begin(), v.end());     long long y = 0;     for (auto i : v) y = y * 10 + i;     return y;   }   int main() {     ios::sync_with_stdio(0);     cin >> n;     for (int i = 0; i < n; i++) {       cin >> st;       for (int j = 0; j < n; j++) a[i][j] = (st[j] ==  1 );     }     for (int i = 0; i < n; i++) dp[i][1 << i] = 1;     for (int i = 1; i < (1 << n); i++) {       for (int j = 0; j < n; j++) {         if (dp[j][i]) {           g[bp(i)][i] += dp[j][i];           for (int k = 0; k < n; k++)             if (!(i >> k & 1) && a[j][k]) dp[k][i | (1 << k)] += dp[j][i];         }       }     }     for (int i = 1; i <= n; i++)       for (int j = 0; j < n; j++)         for (int s = 0; s < (1 << n); s++)           if (s >> j & 1) g[i][s] += g[i][s ^ (1 << j)];     for (int i = 0; i < (1 << n); i++) d[0][i] = 1;     dfs(1, 0, 0, 0);     for (int i = 0; i < (1 << (n - 1)); i++) f[i] = mp[ch(i)];     for (int i = 0; i < n - 1; i++)       for (int j = 0; j < (1 << (n - 1)); j++)         if (!(j >> i & 1)) f[j] -= f[j ^ (1 << i)];     for (int i = 0; i < (1 << (n - 1)); i++) printf( %lld  , f[i]);     return 0;   }   