#include <bits/stdc++.h>
using namespace std;
int S[400005];
void add(int first, int k) {
  for (int i = first; i < 400005; i += i & -i) {
    S[i] += k;
  }
}
int query(int first) {
  int res = 0;
  for (int i = first; i > 0; i -= i & -i) {
    res += S[i];
  }
  return res;
}
int main() {
  int n;
  scanf("%d", &n);
  map<int, int> m;
  for (int i = 0; i < n; i++) {
    int first;
    scanf("%d", &first);
    m[first]++;
  }
  for (auto it : m) {
    add(1, 1);
    add(it.second + 1, -1);
  }
  int tot = 0;
  int ans = 0, ansi;
  for (int i = 1; i <= n; i++) {
    tot += query(i);
    if (tot / i < i) break;
    int res = tot / i * i;
    if (res > ans) {
      ans = res;
      ansi = i;
    }
  }
  printf("%d\n", ans);
  printf("%d %d\n", ansi, ans / ansi);
  vector<pair<int, int> > res;
  for (auto it : m) {
    for (int j = 0; j < min(it.second, ansi); j++)
      res.push_back(make_pair(it.second, it.first));
  }
  sort(res.begin(), res.end());
  vector<vector<int> > matrix(ansi);
  for (int i = 0; i < ans / ansi; i++) {
    for (int j = 0; j < ansi; j++) {
      matrix[j].push_back(res.back().second);
      res.pop_back();
    }
  }
  reverse(matrix.begin(), matrix.end());
  for (int i = 0; i < ansi; i++) {
    int m = ans / ansi;
    for (int j = 0; j < ans / ansi; j++) {
      printf("%d ", matrix[i][(j + i) % m]);
    }
    printf("\n");
  }
}
