#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");
  }
}
