#include <bits/stdc++.h>
int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  int n;
  std::cin >> n;
  std::vector<int> a(n);
  std::map<int, int> cnt;
  std::vector<int> with_cnt(n + 1);
  for (int i = 0; i < n; i++) {
    std::cin >> a[i];
    cnt[a[i]]++;
  }
  for (int i = 0; i < n; i++) {
    with_cnt[cnt[a[i]]]++;
  }
  std::vector<int> sf(n + 2);
  for (auto [val, c] : cnt) {
    sf[c]++;
  }
  for (int i = n - 1; i > 0; i--) {
    sf[i] += sf[i + 1];
  }
  int sum = 0;
  int A = 1, B = 1;
  for (int a = 1; a * a <= n; a++) {
    sum += with_cnt[a];
    int b = (sum + sf[a + 1] * a) / a;
    if (b < a) {
      break;
    }
    if (A * B < a * b) {
      A = a;
      B = b;
    }
  }
  std::cout << A * B << "\n";
  std::cout << A << " " << B << "\n";
  std::vector<std::vector<int>> ans(A, std::vector<int>(B, -1));
  std::set<std::pair<int, int>> s;
  for (auto [val, c] : cnt) {
    s.emplace(std::min(c, A), val);
  }
  std::vector<int> can;
  for (auto [c, val] : s) {
    while (c--) {
      can.push_back(val);
    }
  }
  std::reverse(can.begin(), can.end());
  int x = 0, y = 0;
  for (int i = 0; i < A * B; i++) {
    ans[x][y] = can[i];
    (++x) %= A;
    (++y) %= B;
    if (~ans[x][y]) {
      (++x) %= A;
    }
  }
  for (int i = 0; i < A; i++) {
    for (int j = 0; j < B; j++) {
      std::cout << ans[i][j] << " \n"[j == B - 1];
    }
  }
  return 0;
}
