#include <bits/stdc++.h>
using namespace std;
#pragma warning(disable : 4996)
vector<int> E[120], G[120];
char a[11000][110], c[11000][110];
int main() {
  int n, x;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d", &x);
    E[x].push_back(i);
    G[x].push_back(i);
  }
  for (int i = 0; i <= 10000; i++)
    for (int j = 0; j < n; j++) a[i][j] = c[i][j] = '0';
  int cnt = 0, ans;
  for (int i = 100; i >= 0; i--) {
    if (E[i].size() == n) {
      ans = i;
      break;
    }
    if (E[i].empty()) continue;
    if (E[i].size() >= 2) {
      int up = E[i].size() / 2;
      for (int j = 0; j < up; j++) {
        a[cnt][E[i][0]] = '1';
        E[i - 1].push_back(E[i][0]);
        E[i].erase(E[i].begin());
        a[cnt][E[i][0]] = '1';
        E[i - 1].push_back(E[i][0]);
        E[i].erase(E[i].begin());
        cnt++;
      }
    }
    if (E[i].size() == 1) {
      int k = i - 1;
      while (E[k].empty()) k--;
      a[cnt][E[i][0]] = '1';
      a[cnt][E[k][0]] = '1';
      if (k) {
        E[k - 1].push_back(E[k][0]);
        E[k].erase(E[k].begin());
      }
      E[i - 1].push_back(E[i][0]);
      cnt++;
    }
  }
  if (n == 2) {
    printf("%d\n", ans);
    printf("%d\n", cnt);
    for (int i = 0; i < cnt; i++) cout << a[i] << '\n';
    return 0;
  }
  int res = cnt, result;
  cnt = 0;
  int o = 100, p, q;
  while (G[o].empty()) o--;
  if (G[o].size() >= 3) {
    G[o - 1].push_back(G[o][0]);
    c[cnt][G[o][0]] = '1';
    G[o].erase(G[o].begin());
    G[o - 1].push_back(G[o][0]);
    c[cnt][G[o][0]] = '1';
    G[o].erase(G[o].begin());
    G[o - 1].push_back(G[o][0]);
    c[cnt][G[o][0]] = '1';
    G[o].erase(G[o].begin());
  } else if (G[o].size() == 2) {
    p = o - 1;
    while (G[p].empty()) p--;
    G[p - 1].push_back(G[p][0]);
    c[cnt][G[p][0]] = '1';
    G[p].erase(G[p].begin());
    G[o - 1].push_back(G[o][0]);
    c[cnt][G[o][0]] = '1';
    G[o].erase(G[o].begin());
    G[o - 1].push_back(G[o][0]);
    c[cnt][G[o][0]] = '1';
    G[o].erase(G[o].begin());
  } else {
    p = o - 1;
    while (G[p].empty()) p--;
    if (G[p].size() >= 2) {
      G[p - 1].push_back(G[p][0]);
      c[cnt][G[p][0]] = '1';
      G[p].erase(G[p].begin());
      G[p - 1].push_back(G[p][0]);
      c[cnt][G[p][0]] = '1';
      G[p].erase(G[p].begin());
      G[o - 1].push_back(G[o][0]);
      c[cnt][G[o][0]] = '1';
      G[o].erase(G[o].begin());
    } else {
      q = p - 1;
      while (G[q].empty()) q--;
      G[q - 1].push_back(G[q][0]);
      c[cnt][G[q][0]] = '1';
      G[q].erase(G[q].begin());
      G[p - 1].push_back(G[p][0]);
      c[cnt][G[p][0]] = '1';
      G[p].erase(G[p].begin());
      G[o - 1].push_back(G[o][0]);
      c[cnt][G[o][0]] = '1';
      G[o].erase(G[o].begin());
    }
  }
  cnt++;
  for (int i = 100; i >= 0; i--) {
    if (G[i].size() == n) {
      result = i;
      break;
    }
    if (G[i].empty()) continue;
    if (G[i].size() >= 2) {
      int up = G[i].size() / 2;
      for (int j = 0; j < up; j++) {
        c[cnt][G[i][0]] = '1';
        G[i - 1].push_back(G[i][0]);
        G[i].erase(G[i].begin());
        c[cnt][G[i][0]] = '1';
        G[i - 1].push_back(G[i][0]);
        G[i].erase(G[i].begin());
        cnt++;
      }
    }
    if (G[i].size() == 1) {
      int k = i - 1;
      while (G[k].empty()) k--;
      c[cnt][G[i][0]] = '1';
      c[cnt][G[k][0]] = '1';
      if (k) {
        G[k - 1].push_back(G[k][0]);
        G[k].erase(G[k].begin());
      }
      G[i - 1].push_back(G[i][0]);
      cnt++;
    }
  }
  if (result > ans) {
    printf("%d\n%d\n", result, cnt);
    for (int i = 0; i < cnt; i++) cout << c[i] << '\n';
  } else {
    printf("%d\n%d\n", ans, res);
    for (int i = 0; i < res; i++) cout << a[i] << '\n';
  }
}
