#include <bits/stdc++.h>
using namespace std;
template <class A, class B>
using umap = unordered_map<A, B>;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n;
  cin >> n;
  vector<int> a(n);
  umap<int, int> f, ff;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    ++ff[++f[a[i]]];
  }
  a.clear();
  int h = 0, w = 0, sum = 0;
  for (int i = 1;; i++) {
    sum += ff[i];
    int len = sum / i;
    if (len < i) break;
    if (i * len > h * w) {
      h = i, w = len;
    }
  }
  a.clear();
  for (auto p : f) {
    for (int i = 0; i < min(p.second, h); i++) {
      a.push_back(p.first);
    }
  }
  sort(a.begin(), a.end(),
       [&](int x, int y) { return tie(f[x], x) > tie(f[y], y); });
  vector<vector<int>> ans(h, vector<int>(w));
  vector<vector<bool>> seen(h, vector<bool>(w));
  for (int i = 0, j = 0, k = 0; k < h * w; k++) {
    ans[i][j] = a[k];
    seen[i][j] = true;
    i++, j++;
    i %= h, j %= w;
    while (k < h * w - 1 && seen[i][j]) {
      i++, i %= h;
    }
  }
  cout << h * w << '\n' << h << ' ' << w << '\n';
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cout << ans[i][j] << " \n"[j == w - 1];
    }
  }
}
