#include <bits/stdc++.h>   using namespace std;   const int MOD = 1000000007;   const int UNDEF = -1;   const long long INF = 1e18;   template <typename T>   inline bool chkmax(T &aa, T bb) {     return aa < bb ? aa = bb, true : false;   }   template <typename T>   inline bool chkmin(T &aa, T bb) {     return aa > bb ? aa = bb, true : false;   }   int rint();   char rch();   long long rlong();   const int mv = 160;   const int mc = ((mv * (mv - 1)) / 2) + 1;   const int ma = 31;   bitset<mc> f[mv][ma];   void reset() {     for (int v = 0; v < mv; v++)       for (int ai = 0; ai < ma; ai++) f[v][ai].reset();   }   vector<int> solve(vector<int> &a) {     vector<int> fail;     sort(a.begin(), a.end());     int alim = a.size();     f[0][0][a[0]] = true;     {       int v = 0;       int klim = (v * (v + 1)) / 2;       if (f[(v)][alim - 1][klim]) {         return vector<int>({a[0]});       }     }     for (int v = 1; v < mv; v++) {       for (int sai = 0; sai < alim; sai++) {         for (int dai = sai; dai <= min(alim - 1, sai + 1); dai++) {           int shift = a[dai];           f[(v)][dai] |= (f[(v)-1][sai] << shift);         }       }       int klim = (v * (v + 1)) / 2;       if (f[(v)][alim - 1][klim]) {         vector<int> final;         int ai = alim - 1;         int k = klim;         for (int x = v; x >= 1; x--) {           final.push_back(a[ai]);           k -= a[ai];           if (f[x - 1][ai][k]) {             ai = ai;           } else {             ai--;           }         }         final.push_back(a[0]);         sort(final.begin(), final.end());         return final;       }       bitset<mc> filt;       filt.set();       filt >>= klim;       filt <<= klim;       for (int ai = 0; ai < alim; ai++) {         f[(v)][ai] &= filt;       }     }     return fail;   }   bool vans[mv + 2][mv + 2];   void recurse(vector<int> &r) {     int n = r.size() - 1;     if (n == 0) return;     vector<int> R;     R.push_back(-1);     int sum = 0;     for (int i = 1; i <= n; i++) {       sum += r[i];       R.push_back(sum);     }     int s = n - 1 - r[n];     vector<int> F;     F.resize(n + 1);     for (int v = 1; v <= n; v++) F[v] = R[v] - (v * (v - 1)) / 2;     int j = 1;     vector<int> rp = r;     for (int x = 1; x <= n; x++) vans[n][x] = 1;     vans[n][n] = 0;     vector<int> vj;     vj.resize(s + 1);     for (int d = 1; d <= s; d++) {       int vmin = max(1, vj[d - 1] + 1);       int ans = vmin;       for (int v = n - 1; v >= vmin; v--) {         if (F[v] < d) {           ans = v + 1;           break;         }       }       vj[d] = ans;     }     for (int d = 1; d <= s; d++) {       int j = vj[d];       assert(j <= n - 1);       vans[n][j] = 0;       vans[j][n] = 1;       rp[j]--;     }     rp.resize(rp.size() - 1);     recurse(rp);   }   vector<int> fgot;   int comb(vector<int> &va) {     auto got = solve(va);     fgot = got;     if (got.size() == 0) {       printf( =( n );       return 0;     } else {       vector<int> r;       r.push_back(-1);       for (auto &w : got) r.push_back(w);       recurse(r);       int sz = got.size();       printf( %d n , sz);       for (int x = 1; x <= sz; x++) {         for (int y = 1; y <= sz; y++) {           printf( %d , (int)vans[x][y]);         }         printf(  n );       }       return sz;     }   }   void test() {     reset();     memset(vans, 0, sizeof vans);     vector<int> va;     int p = (rand() % 100);     for (int x = 0; x <= 30; x++) {       if (rand() % 100 <= p) va.push_back(x);     }     if (va.size() == 0) va.push_back(rand() % 31);     int got = comb(va);     if (got != 0) {       set<int> s;       for (int x = 1; x <= got; x++) {         assert(vans[x][x] == 0);         int degout = 0;         for (int y = 1; y <= got; y++) {           degout += vans[x][y];         }         s.insert(degout);       }       for (int x = 1; x <= got; x++) {         for (int y = 1; y <= got; y++) {           if (x == y) continue;           assert(vans[x][y] + vans[y][x] == 1);         }       }       set<int> sa;       for (auto &w : va) sa.insert(w);       if (s != sa) {         for (auto &w : sa) printf( %d  , w);         printf(  sa n );         for (auto &w : s) printf( %d  , w);         printf(  s n );         for (auto &w : fgot) printf( %d  , w);         printf(  fgot n );         exit(1);       }     }   }   void go() {     for (int k = 0; k < 100000; k++) {       srand(clock());       test();     }   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     int n = rint();     vector<int> va;     va.reserve(n);     for (int i = 0; i < n; i++) {       int x = rint();       va.push_back(x);     }     comb(va);   }   static char stdinBuffer[1024];   static char *stdinDataEnd = stdinBuffer + sizeof(stdinBuffer);   static const char *stdinPos = stdinDataEnd;   void readAhead(size_t amount) {     size_t remaining = stdinDataEnd - stdinPos;     if (remaining < amount) {       memmove(stdinBuffer, stdinPos, remaining);       size_t sz = fread(stdinBuffer + remaining, 1,                         sizeof(stdinBuffer) - remaining, stdin);       stdinPos = stdinBuffer;       stdinDataEnd = stdinBuffer + remaining + sz;       if (stdinDataEnd != stdinBuffer + sizeof(stdinBuffer)) *stdinDataEnd = 0;     }   }   int rint() {     readAhead(16);     int x = 0;     bool neg = false;     while (*stdinPos ==     || *stdinPos ==   n ) ++stdinPos;     if (*stdinPos ==  - ) {       ++stdinPos;       neg = true;     }     while (*stdinPos >=  0  && *stdinPos <=  9 ) {       x *= 10;       x += *stdinPos -  0 ;       ++stdinPos;     }     return neg ? -x : x;   }   char rch() {     readAhead(16);     while (*stdinPos ==     || *stdinPos ==   n ) ++stdinPos;     char ans = *stdinPos;     ++stdinPos;     return ans;   }   long long rlong() {     readAhead(32);     long long x = 0;     bool neg = false;     while (*stdinPos ==     || *stdinPos ==   n ) ++stdinPos;     if (*stdinPos ==  - ) {       ++stdinPos;       neg = true;     }     while (*stdinPos >=  0  && *stdinPos <=  9 ) {       x *= 10;       x += *stdinPos -  0 ;       ++stdinPos;     }     return neg ? -x : x;   }