#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using PII = pair<int, int>;
const int N = 4e5 + 10, RN = 650;
PII val[N];
int solve(int a, int len) {
  int sz = 0;
  for (int i = 0; i < len; i++) {
    sz += min(val[i].first, a);
  }
  sz = sz - (sz % a);
  if (sz >= a * a) {
    return sz;
  }
  return 0;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n;
  cin >> n;
  map<int, int> freq;
  for (int i = 0; i < n; i++) {
    int x;
    cin >> x;
    freq[x]++;
  }
  int len = 0;
  for (const auto& e : freq) {
    val[len++] = make_pair(e.second, e.first);
  }
  sort(val, val + len);
  PII best(len, 1);
  int tot = 0;
  for (int a = 1, i = 0; a < N; a++) {
    while (i < len && val[i].first <= a) {
      tot += val[i].first;
      i++;
    }
    int sz = tot + (len - i) * a;
    int b = sz / a;
    if (b >= a) {
      best = max(best, make_pair(b * a, a));
    }
  }
  int a = best.second;
  int b = best.first / a;
  vector<vector<int>> ans(a, vector<int>(b, -1));
  int diag = 0, pos = 0;
  for (int it = len - 1; it >= 0; it--) {
    int f = min(a, val[it].first);
    int cur = val[it].second;
    while (f--) {
      ans[pos][(diag + pos) % b] = cur;
      pos++;
      if (pos == a) {
        pos = 0;
        diag++;
        if (diag == b) break;
      }
    }
    if (diag == b) break;
  }
  cout << (a * b) << '\n';
  cout << a << ' ' << b << '\n';
  for (int i = 0; i < a; i++) {
    for (int j = 0; j < b; j++) {
      cout << ans[i][j] << ' ';
    }
    cout << '\n';
  }
  return 0;
}
