#include <bits/stdc++.h>
using namespace std;
int main() {
  ios::sync_with_stdio(false);
  int n;
  cin >> n;
  map<int, int> m;
  for (int i = 0; i < n; i++) {
    int x;
    cin >> x;
    m[x]++;
  }
  vector<pair<int, int> > pv;
  for (auto item : m) {
    pv.push_back(make_pair(item.second, item.first));
  }
  sort(pv.begin(), pv.end());
  int mx = 0;
  int cols = 0, rows = 0;
  int pvsize = pv.size();
  int cur = 0, presum = 0;
  for (int col = 1; col <= pvsize; col++) {
    while (cur < pvsize && pv[cur].first <= col) {
      presum += pv[cur].first;
      cur++;
    }
    int sum = presum + (pvsize - cur) * col;
    int row = sum / col;
    if (row >= col && row * col > mx) {
      mx = row * col;
      rows = row;
      cols = col;
    }
  }
  cout << mx << " " << endl;
  cout << rows << " " << cols << endl;
  vector<int> v;
  for (auto item : pv) {
    int k = min(cols, item.first);
    for (int j = 0; j < k; j++) v.push_back(item.second);
  }
  reverse(v.begin(), v.end());
  vector<vector<int> > ans(rows, vector<int>(cols));
  int index = 0;
  for (int row = 0; row < rows; row++) {
    for (int j = 0; j < cols; j++) {
      ans[(row + j) % rows][j] = v[index++];
    }
  }
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
      cout << ans[i][j];
      if (j == cols - 1)
        cout << endl;
      else
        cout << " ";
    }
  }
  return 0;
}
