#include <bits/stdc++.h>
using namespace std;
using namespace std::chrono;
int a[400005], g[400005];
map<int, int> mp;
vector<int> v[400005];
int main() {
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    mp[a[i]]++;
  }
  for (auto it : mp) {
    v[it.second].push_back(it.first);
  }
  for (int i = n; i >= 0; i--) {
    g[i] = g[i + 1] + v[i].size();
  }
  int best = 0, bestx = 0, besty = 0, x, y = 0, total = 0, cnt = 0;
  for (int i = 1; i <= n; i++) {
    total += g[i];
    x = total / i;
    if (x >= i && best <= x * i) {
      bestx = i;
      besty = x;
      best = x * i;
    }
  }
  cout << best << '\n' << bestx << " " << besty << '\n';
  x = 0;
  y = 0;
  if (bestx > besty) swap(bestx, besty);
  vector<vector<int>> ans(bestx, vector<int>(besty));
  for (int i = n; i >= 1; i--) {
    for (auto val : v[i]) {
      for (int j = 0; j < min(i, bestx); j++) {
        if (ans[x][y] != 0) x = (x + 1) % bestx;
        if (ans[x][y] == 0) ans[x][y] = val;
        x = (x + 1) % bestx;
        y = (y + 1) % besty;
      }
    }
  }
  for (int i = 0; i < bestx; i++) {
    for (int j = 0; j < besty; j++) {
      cout << ans[i][j] << " ";
    }
    cout << '\n';
  }
}
