#include <bits/stdc++.h>
using namespace std;
int a[19260817], b[400004], c[400004], d[400004], e[400004], i, j, m, n, s, t,
    x, y;
inline bool cmp(int u, int v) { return d[v] < d[u]; }
inline int find(int u) {
  int v = u % 19260817;
  for (s = a[v]; s; s = b[s])
    if (c[s] == u) return s;
  return b[++t] = a[v], c[a[v] = t] = u, t;
}
int main() {
  scanf("%d", &n), m = n;
  for (i = 1; i <= n; i++) scanf("%d", &j), d[find(j)]++;
  for (i = 1; i <= t; i++) e[d[i]]++;
  for (i = n; i; i--)
    (long long)i *i <= m &&x < m / i *i ? x = m / i * i, y = i : 0, m -= e[i],
                                          e[i - 1] += e[i];
  for (printf("%d\n", x), i = 1, s = 0; i <= t; i++) d[a[i] = i] = min(d[i], y);
  for (sort(a + 1, a + t + 1, cmp), i = 1; i <= t; i++)
    while (d[a[i]]--) b[++s] = c[a[i]];
  for (printf("%d %d\n", y, x /= y), i = s = 0; i < x; i++)
    for (j = 0; j < y; j++) e[j * x + (i + j) % x] = b[++s];
  for (i = s = 0; i < y; i++)
    for (j = 0; j < x; j++) printf("%d%c", e[s++], j + 1 == x ? '\n' : ' ');
  return 0;
}
