#include <bits/stdc++.h>
using namespace std;
const int maxn = 400005;
map<int, int> m;
int geq[maxn];
int main() {
  ios::sync_with_stdio(false);
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    int x;
    cin >> x;
    m[x]++;
  }
  vector<vector<int>> cnt(n + 1);
  for (auto it : m) {
    cnt[it.second].push_back(it.first);
  }
  geq[n] = cnt[n].size();
  for (int i = n - 1; i >= 1; i--) {
    geq[i] = geq[i + 1] + cnt[i].size();
  }
  int S = 0;
  int maxa = 0;
  int maxb = 0;
  int maxans = 0;
  for (int a = 1; a <= n; a++) {
    S += geq[a];
    int b = S / a;
    if (a <= b && maxans < a * b) {
      maxans = a * b;
      maxa = a;
      maxb = b;
    }
  }
  cout << maxa * maxb << endl;
  cout << maxa << " " << maxb << endl;
  vector<vector<int>> ans(maxa, vector<int>(maxb));
  int x = 0, y = 0;
  for (int i = n; i >= 1; i--) {
    for (auto it : cnt[i]) {
      for (int j = 0; j < min(maxa, i); j++) {
        if (ans[x][y] != 0) x = (x + 1) % maxa;
        if (ans[x][y] == 0) ans[x][y] = it;
        x = (x + 1) % maxa;
        y = (y + 1) % maxb;
      }
    }
  }
  for (int i = 0; i < maxa; i++) {
    for (int j = 0; j < maxb; j++) {
      cout << ans[i][j] << " ";
    }
    cout << endl;
  }
  return 0;
}
