#include <bits/stdc++.h>   using namespace std;   template <class T, size_t N>   ostream& operator<<(ostream& os, const array<T, N>& v);   template <class T1, class T2>   ostream& operator<<(ostream& os, const pair<T1, T2>& p) {     return os <<  (  << p.first <<  ,   << p.second <<  ) ;   }   template <class T>   ostream& operator<<(ostream& os, const vector<T>& v) {     bool f = 1;     os <<  [ ;     for (auto& i : v) {       if (!f) os <<  ,  ;       os << i;       f = 0;     }     return os <<  ] ;   }   template <class T, size_t N>   ostream& operator<<(ostream& os, const array<T, N>& v) {     bool f = 1;     os <<  [ ;     for (auto& i : v) {       if (!f) os <<  ,  ;       os << i;       f = 0;     }     return os <<  ] ;   }   template <class T1, class T2>   ostream& operator<<(ostream& os, const set<T1, T2>& v) {     bool f = 1;     os <<  [ ;     for (auto& i : v) {       if (!f) os <<  ,  ;       os << i;       f = 0;     }     return os <<  ] ;   }   template <class T1, class T2>   ostream& operator<<(ostream& os, const multiset<T1, T2>& v) {     bool f = 1;     os <<  [ ;     for (auto& i : v) {       if (!f) os <<  ,  ;       os << i;       f = 0;     }     return os <<  ] ;   }   template <class T1, class T2, class T3>   ostream& operator<<(ostream& os, const map<T1, T2, T3>& v) {     bool f = 1;     os <<  [ ;     for (auto& ii : v) {       if (!f) os <<  ,  ;       os <<  (  << ii.first <<   ->   << ii.second <<  )  ;       f = 0;     }     return os <<  ] ;   }   template <class T1, class T2>   ostream& operator<<(ostream& os, const multimap<T1, T2>& v) {     bool f = 1;     os <<  [ ;     for (auto& ii : v) {       if (!f) os <<  ,  ;       os <<  (  << ii.first <<   ->   << ii.second <<  )  ;       f = 0;     }     return os <<  ] ;   }   template <class T1, class T2>   ostream& operator<<(ostream& os, priority_queue<T1, T2> v) {     bool f = 1;     os <<  [ ;     while (!v.empty()) {       auto x = v.top();       v.pop();       if (!f) os <<  ,  ;       f = 0;       os << x;     }     return os <<  ] ;   }   template <class T1, class T2>   void printarray(const T1& a, T2 sz, T2 beg = 0) {     for (T2 i = beg; i < sz; i++) cout << a[i] <<    ;     cout << endl;   }   void cio() {     ios::sync_with_stdio(false);     cin.tie(NULL);   }   const long long mod = 1e9 + 9;   void die() {     printf( -1 n );     exit(0);   }   int N;   int p[500];   void Do(int R) {     for (int i = 1; i <= N; i++)       if (p[i] < R) return;     bool odd = false;     int sum = 0;     for (int i = 1; i <= N; i++) sum += p[i] - R;     if (sum % 2) odd = true;     int X;     vector<pair<int, int> > ansv;     set<pair<int, int> > S;     for (int i = 1; i <= N; i++) S.insert({p[i] - R, i});     if (odd) {       auto it = S.end();       it--;       pair<int, int> pp = *it;       X = pp.second;       S.erase(it);       S.insert({pp.first - 1, pp.second});       sum--;     }     if (S.rbegin()->first * 2 > sum) return;     while (true) {       auto it1 = S.end();       it1--;       S.erase(it1);       auto it2 = S.end();       it2--;       S.erase(it2);       pair<int, int> p1 = *it1, p2 = *it2;       if (p1.first == 0 || p2.first == 0) break;       ansv.push_back({p1.second, p2.second});       S.insert({p1.first - 1, p1.second});       S.insert({p2.first - 1, p2.second});     }     if (odd && (int)ansv.size() == 0) return;     if (odd) {       bool flag = false;       for (auto e : ansv) {         if (e.first != X && e.second != X) flag = true;       }       if (!flag) return;     }     printf( %d n , R);     printf( %d n , (int)ansv.size());     for (auto e : ansv) {       for (int i = 1; i <= N; i++) {         if (e.first == i || e.second == i)           printf( 1 );         else if (odd && (e.first != X && e.second != X) && i == X) {           odd = false;           printf( 1 );         } else           printf( 0 );       }       printf(  n );     }     exit(0);   }   int main() {     scanf( %d , &N);     for (int i = 1; i <= N; i++) scanf( %d , &p[i]);     for (int x = 100; x >= 1; x--) {       Do(x);     }     printf( 0 n );     vector<pair<int, int> > ansv;     while (p[1] > 0 && p[2] > 0) {       p[1]--;       p[2]--;       ansv.push_back({1, 2});     }     int X = 1;     if (p[2] == 0) X = 2;     for (int i = 1; i <= N; i++)       if (i != X) {         while (p[i] > 0) {           p[i]--;           ansv.push_back({X, i});         }       }     printf( %d n , (int)ansv.size());     for (auto e : ansv) {       for (int i = 1; i <= N; i++) {         if (e.first == i || e.second == i)           printf( 1 );         else           printf( 0 );       }       printf(  n );     }   }