func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 34;   const int M = 70;   int n;   int arr[N];   int dp[N][M * M][M];   int find(int pos, int sum, int cnt) {     if (pos > n) {       return (sum * 2 == cnt * (cnt - 1)) ? cnt : M;     }     if (dp[pos][sum][cnt] != -1) {       return dp[pos][sum][cnt];     }     int res = M;     int cur = sum;     int tot = cnt;     for (int i = 1; tot < 65; ++i) {       ++tot;       cur += arr[pos];       if (cur * 2 >= tot * (tot - 1)) {         res = min(res, find(pos + 1, cur, tot));       }     }     return dp[pos][sum][cnt] = res;   }   int deg[M];   void go(int pos, int sum, int cnt) {     if (pos > n) {       return;     }     int cur = sum;     int tot = cnt;     for (int i = 1; tot < 65; ++i) {       ++tot;       cur += arr[pos];       deg[tot] = arr[pos];       if (cur * 2 >= tot * (tot - 1)) {         if (find(pos + 1, cur, tot) == find(pos, sum, cnt)) {           go(pos + 1, cur, tot);           return;         }       }     }   }   int graph[M][M];   pair<int, int> out[M];   int main() {     cin >> n;     for (int i = 1; i <= n; ++i) {       cin >> arr[i];     }     sort(arr + 1, arr + 1 + n);     memset(dp, -1, sizeof(dp));     int m = find(1, 0, 0);     go(1, 0, 0);     for (int i = 1; i <= m; ++i) {       out[i] = make_pair(deg[i], i);     }     sort(out + 1, out + 1 + m);     for (int i = 1; i <= m; ++i) {       for (int j = i + 1; j <= i + out[i].first; ++j) {         graph[out[i].second][out[j].second] = 1;       }       for (int j = i + out[i].first + 1; j <= m; ++j) {         graph[out[j].second][out[i].second] = 1;         --out[j].first;       }       out[i].first = 0;       sort(out + i + 1, out + 1 + m);     }     printf( %d n , m);     for (int i = 1; i <= m; ++i) {       for (int j = 1; j <= m; ++j) {         printf( %d , graph[i][j]);       }       printf(  n );     }   }   