#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) {
  if (!b) return a;
  return gcd(b, a % b);
}
const long long maxd = 4e5 + 10;
long long cnt[maxd], n, ans[maxd];
map<long long, long long> mp;
vector<pair<long long, long long> > a;
bool cmp(const pair<long long, long long> a,
         const pair<long long, long long> b) {
  return a.second > b.second;
}
int main() {
  scanf("%lld", &n);
  for (long long i = 1; i <= n; i++) {
    long long x;
    scanf("%lld", &x);
    mp[x]++;
  }
  for (auto p : mp) a.push_back(p);
  sort(a.begin(), a.end(), cmp);
  for (auto x : a) cnt[x.second]++;
  long long now = a.size(), mx = 0, row = 0, sum = 0;
  for (int i = 1; i * i <= n; i++) {
    sum += cnt[i] * i;
    now -= cnt[i];
    long long t = now * i + sum;
    if (t < i * i) continue;
    if (t / i * i > mx) mx = t / i * i, row = i;
  }
  long long col = mx / row, x = 1, y = 1;
  for (long long i = 1; i <= a.size(); i++) {
    long long num = min(row, a[i - 1].second);
    while (num--) {
      ans[(x - 1) * col + y] = a[i - 1].first;
      x = (x % row) + 1, y = (y % col) + 1;
      if (ans[(x - 1) * col + y]) y = (y % col) + 1;
    }
  }
  printf("%lld\n", mx);
  printf("%lld ", row);
  printf("%lld\n", col);
  for (long long i = 1; i <= row; i++)
    for (long long j = 1; j <= col; j++)
      if (j == col)
        printf("%lld\n", ans[(i - 1) * col + j]);
      else
        printf("%lld ", ans[(i - 1) * col + j]);
  return 0;
}
