#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e5 + 5;
int n, N;
int a[maxn], num[maxn], cnt[maxn];
vector<int> p;
int getid(int w) { return lower_bound(p.begin(), p.end(), w) - p.begin() + 1; }
int ans, ax, ay, x, y;
int fang[maxn], t;
int sum;
vector<int> Ans[maxn];
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    p.push_back(a[i]);
  }
  sort(p.begin(), p.end());
  p.erase(unique(p.begin(), p.end()), p.end());
  for (int i = 1; i <= n; i++) {
    a[i] = getid(a[i]);
    num[a[i]]++;
  }
  for (int i = 1; i <= p.size(); i++) {
    cnt[num[i]]++;
  }
  N = p.size();
  for (int i = 1; i <= n; i++) {
    sum += cnt[i] * i;
    N -= cnt[i];
    x = i;
    y = (N * i + sum) / i;
    if (y < x) break;
    if (ans < x * y) {
      ans = max(ans, x * y);
      ax = x;
      ay = y;
    }
  }
  for (int i = 1; i <= p.size(); i++) {
    num[i] = min(num[i], ax);
    if (num[i] == ax) {
      for (int j = 1; j <= num[i]; j++) fang[++t] = p[i - 1];
    }
  }
  for (int i = 1; i <= p.size(); i++) {
    if (num[i] < ax) {
      for (int j = 1; j <= num[i]; j++) fang[++t] = p[i - 1];
    }
  }
  int p = 1;
  cout << ans << '\n' << ax << ' ' << ay << '\n';
  for (int i = 1; i <= ax; i++) Ans[i] = vector<int>(ay + 1, 0);
  for (int i = 0; i < ay; i++) {
    x = 1;
    y = i + 1;
    for (int j = 1; j <= ax; j++) {
      Ans[x][y] = fang[p++];
      x++;
      y++;
      if (y > ay) y -= ay;
    }
  }
  for (int i = 1; i <= ax; i++) {
    for (int j = 1; j <= ay; j++) {
      cout << Ans[i][j] << ' ';
    }
    cout << '\n';
  }
}
