#include <bits/stdc++.h>
const long long MOD = 1e9 + 7;
const long long INF = 1e18;
using namespace std;
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  long long n;
  cin >> n;
  map<long long, long long> tmp;
  int a;
  for (int i = 0; i < n; i++) {
    cin >> a;
    tmp[a]++;
  }
  long long cnt[n + 10];
  memset(cnt, 0, sizeof(cnt));
  for (auto x : tmp) cnt[x.second]++;
  long long res = 0, ans = n;
  long long m = n;
  for (long long i = n; i >= 1; i--) {
    m -= cnt[i + 1];
    cnt[i] += cnt[i + 1];
    if (i * i > m) continue;
    int k = (m / i) * i;
    if (k > res and (m / i) >= i) {
      res = k;
      ans = i;
    }
  }
  int mat[(res / ans) + 2][(ans) + 3];
  long long c = res / ans, d = ans;
  long long x = 0, y = 0;
  cout << res << "\n";
  vector<pair<long long, long long>> tak;
  for (auto x : tmp) {
    if (x.second) tak.push_back({x.second, x.first});
  }
  sort(tak.begin(), tak.end(), greater<pair<long long, long long>>());
  for (auto kk : tak) {
    for (int j = 0; j < min((long long)kk.first, ans) and res--; j++) {
      mat[(x + y) % c][y] = kk.second;
      x = (x + (y == (d - 1))) % c, y = (y + 1) % d;
    }
  }
  cout << c << " " << d << "\n";
  for (int i = 0; i < c; i++) {
    for (int j = 0; j < d; j++) cout << mat[i][j] << " ";
    cout << "\n";
  }
}
