func_code_string: #include <bits/stdc++.h>   char ch;   bool fs;   void re(int& x) {     while (ch = getchar(), ch < 33)       ;     if (ch ==  - )       fs = 1, x = 0;     else       fs = 0, x = ch - 48;     while (ch = getchar(), ch > 33) x = x * 10 + ch - 48;     if (fs) x = -x;   }   using namespace std;   pair<int, int> d[62];   int n;   int m, a[32], use[32][64][2048];   bool f[32][64][2048], edge[64][64];   int main() {     re(m);     for (int i = 1; i <= m; ++i) re(a[i]);     sort(a + 1, a + m + 1);     f[0][0][0] = 1;     for (int i = 1; i <= m; ++i)       for (int j = i; j <= 61; ++j)         for (int k = j * (j - 1) / 2; k <= 2000; ++k)           for (int l = 1; l <= j && l * a[i] <= k; ++l)             if (f[i - 1][j - l][k - l * a[i]]) {               f[i][j][k] = 1;               use[i][j][k] = l;               break;             }     for (int i = 1; i <= 61; ++i)       if (f[m][i][i * (i - 1) / 2]) {         printf( %d n , i);         int a = m, b = i, c = i * (i - 1) / 2;         while (a) {           int t = use[a][b][c];           for (int j = 1; j <= t; ++j) d[++n].first = ::a[a], d[n].second = n;           c -= t * ::a[a];           b -= t;           --a;         }         for (int j = 1; j <= n; ++j) {           sort(d + j, d + n + 1);           for (int k = j + 1; k <= j + d[j].first; ++k)             edge[d[j].second][d[k].second] = 1;           for (int k = j + d[j].first + 1; k <= n; ++k)             edge[d[k].second][d[j].second] = 1, --d[k].first;           d[j].first = 0;         }         for (int j = 1; j <= n; ++j, puts(  ))           for (int k = 1; k <= n; ++k) printf( %d , edge[j][k]);         return 0;       }     puts( -1 );   }   