#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 10;
int a[N];
vector<pair<int, int> > e;
vector<pair<int, pair<int, int> > > solution;
int main() {
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  sort(a, a + n);
  int cnt = 0;
  for (int i = 0; i < n; i++) {
    if (i > 0 && a[i] != a[i - 1]) {
      e.push_back(make_pair(cnt, a[i - 1]));
      cnt = 1;
    } else {
      cnt++;
    }
  }
  e.push_back(make_pair(cnt, a[n - 1]));
  sort(e.begin(), e.end());
  int best = 0, bp, bq, bi;
  int max = e[e.size() - 1].first;
  int ind = 0;
  int passed = 0;
  for (int i = 1; i <= max; i++) {
    while (ind < e.size() && e[ind].first < i) {
      passed += e[ind].first;
      ind++;
    }
    int available = passed + i * (e.size() - ind);
    for (int j = i; j <= available / j; j++) {
      int k = available / j;
      int t = j * k;
      if (best < t) {
        best = t;
        bp = j;
        bq = k;
        bi = i;
      }
    }
  }
  printf("%d\n%d %d\n", best, bp, bq);
  int ci = 0, cj = 0, ncj = 1;
  for (int i = e.size() - 1; i >= 0; i--) {
    for (int j = 0; j < bi && j < e[i].first && solution.size() < best; j++) {
      solution.push_back(make_pair(ci, make_pair(cj % bq, e[i].second)));
      ci = (ci + 1);
      cj = (cj + 1);
      if (ci == bp) {
        ci = 0;
        cj = ncj++;
      }
    }
  }
  sort(solution.begin(), solution.end());
  int nn = 0;
  for (int i = 0; i < bp; i++) {
    for (int j = 0; j < bq; j++) {
      if (j > 0) printf(" ");
      printf("%d", solution[nn++].second.second);
    }
    printf("\n");
  }
  return 0;
}
