#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
void solve() {
  long long int n;
  cin >> n;
  map<long long int, long long int> occur;
  for (long long int i = 0; i < n; i++) {
    long long int a;
    cin >> a;
    occur[a]++;
  }
  vector<pair<long long int, long long int>> a;
  for (pair<long long int, long long int> p : occur) {
    a.push_back({p.second, p.first});
  }
  sort((a).begin(), (a).end(), greater<pair<long long int, long long int>>());
  long long int extra = 0;
  long long int best = 0;
  long long int Bw, Bh;
  long long int total = n;
  for (long long int i = n, j = 0; i >= 1; i--) {
    while (j < (long long int)a.size() && a[j].first >= i) {
      total -= a[j].first;
      extra++;
      j++;
    }
    long long int h = i;
    long long int w = (total + extra * i) / i;
    if (w >= h && w * h > best) {
      best = w * h;
      Bw = w;
      Bh = h;
    }
  }
  cout << best << '\n';
  cout << Bh << " " << Bw << '\n';
  vector<long long int> put;
  for (long long int i = 0; i < (long long int)a.size(); i++) {
    for (long long int j = 0; j < min(a[i].first, Bh); j++) {
      put.push_back(a[i].second);
    }
  }
  vector<vector<long long int>> ans(Bh, vector<long long int>(Bw));
  long long int x = 0, x0 = 1, y = 0, id = 0;
  for (long long int i = 0; i < (long long int)put.size(); i++) {
    ans[y][x] = put[i];
    x++, y++;
    if (y == Bh) {
      x = x0++;
      y = 0;
    }
    x %= Bw;
  }
  for (long long int i = 0; i < Bh; i++) {
    for (long long int j = 0; j < Bw; j++) {
      cout << ans[i][j] << " ";
    }
    cout << '\n';
  }
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  solve();
  cerr << "Time : "
       << 1000 * ((long double)clock()) / (long double)CLOCKS_PER_SEC << "ms\n";
  return 0;
}
