#include <bits/stdc++.h>   using namespace std;   const int maxn = 61 * 30 + 5;   pair<int, int> C[62];   int M, A[32], cc;   bool dp[32][62][maxn], D[62][62];   short int fr[32][62][maxn];   int main() {     scanf( %d , &M);     for (int i = 1; i <= M; ++i) scanf( %d , A + i);     sort(A + 1, A + M + 1);     dp[0][0][0] = true;     for (int i = 1; i <= M; ++i)       for (int j = i; j <= 61; ++j)         for (int k = (j * (j - 1)) >> 1; k < maxn; ++k) {           for (int m = 1; m <= j; ++m)             if (k >= m * A[i] && dp[i - 1][j - m][k - m * A[i]]) {               dp[i][j][k] = true;               fr[i][j][k] = m;               break;             }         }     int N = M;     while (!dp[M][N][(N * (N - 1)) >> 1]) ++N;     printf( %d n , N);     for (int i = M, j = N, k = (N * (N - 1)) >> 1; i; --i) {       int c = fr[i][j][k];       j -= c;       k -= c * A[i];       for (int j = 0; j < c; ++j) {         ++cc;         C[cc] = make_pair(A[i], cc);       }     }     for (int i = 1; i <= N; ++i) {       sort(C + 1, C + cc + 1);       for (int j = i + 1; j <= i + C[i].first; ++j)         D[C[i].second][C[j].second] = true;       for (int j = i + C[i].first + 1; j <= N; ++j)         D[C[j].second][C[i].second] = true, --C[j].first;       C[i].first = -1;     }     for (int i = 1; i <= N; ++i) {       for (int j = 1; j <= N; ++j) printf( %d , D[i][j] ? 1 : 0);       printf(  n );     }   }   