#include <bits/stdc++.h>
using namespace std;
long long read() {
  long long x = 0, f = 1;
  char ch = ' ';
  while (!isdigit(ch)) {
    ch = getchar();
    if (ch == '-') f = -1;
  }
  while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
  return x * f;
}
int n, a[400005], b[400005], cnt[400005], ans, x, y, st[400005];
vector<int> mp[1005];
bool cmp(int x, int y) {
  if (cnt[x] != cnt[y]) return cnt[x] > cnt[y];
  return x < y;
}
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) b[i] = a[i] = read();
  sort(b + 1, b + n + 1);
  for (int i = 1; i <= n; i++)
    a[i] = lower_bound(b + 1, b + n + 1, a[i]) - b, cnt[a[i]]++;
  sort(a + 1, a + n + 1, cmp);
  for (int i = 1; i * i <= n; i++) {
    memset(cnt, 0, sizeof(cnt));
    int num = 0;
    for (int j = 1; j <= n; j++) {
      if (cnt[a[j]] < i) {
        cnt[a[j]]++;
        num++;
      }
    }
    if (num / i >= i && i * (num / i) > ans) {
      ans = max(ans, i * (num / i));
      x = i, y = num / i;
    }
  }
  cout << ans << endl << x << " " << y << endl;
  memset(cnt, 0, sizeof(cnt));
  int num = 0;
  for (int j = 1; j <= n; j++) {
    if (cnt[a[j]] < x) {
      cnt[a[j]]++;
      st[++num] = a[j];
    }
  }
  int nowx = 0, nowy = 0;
  num = 1;
  for (int i = 0; i < x; ++i) mp[i].resize(y + 100);
  for (int i = 1; i <= x; i++) {
    int ok = 0;
    for (int j = 1; j <= y; j++) {
      mp[nowx][nowy] = st[num];
      if (++num == x * y + 1) {
        ok = 1;
        break;
      }
      nowx++, nowy++;
      if (nowx == x) nowx = 0, nowy -= x - 1;
      if (nowy < 0) nowy += y;
      if (nowy >= y) nowy -= y;
    }
    if (ok) break;
  }
  for (int i = 0; i < x; i++) {
    for (int j = 0; j < y; j++) {
      printf("%d ", b[mp[i][j]]);
    }
    cout << endl;
  }
}
