#include <bits/stdc++.h>
using namespace std;
const int maxn = (int)4e5 + 100;
const int mod = (int)1e9 + 7;
int n, a[maxn], w, h;
map<int, int> mp;
vector<int> v;
vector<vector<int> > ans;
struct node {
  int cnt, num;
  bool operator<(node b) const { return cnt > b.cnt; }
};
vector<node> s;
set<int> ss;
int main() {
  scanf("%d", &n);
  for (int i = (1); i <= (n); ++i)
    scanf("%d", &a[i]), mp[a[i]]++, ss.insert(a[i]);
  for (auto u : ss) s.push_back({mp[u], u});
  sort(s.begin(), s.end());
  long long tmp = 0;
  for (int i = (1); i <= ((int)ss.size()); ++i) {
    long long num = 0, hh;
    for (auto u : s) num += min(i, u.cnt);
    hh = num / i;
    if (hh < i) break;
    if (i * hh > tmp) tmp = i * hh, h = hh, w = i;
  }
  vector<vector<int> > ans(h + 10);
  for (int i = (0); i <= (h); ++i) ans[i].resize(w + 10);
  v.push_back(-1);
  for (auto u : s)
    for (int i = (1); i <= (min(w, u.cnt)); ++i) v.push_back(u.num);
  for (int i = (1); i <= (w); ++i)
    for (int j = (1); j <= (h); ++j) {
      ans[(i - 2 + j) % h + 1][i] = v[i + w * (j - 1)];
    }
  printf("%d\n%d %d\n", w * h, h, w);
  for (int i = (1); i <= (h); ++i)
    for (int j = (1); j <= (w); ++j) printf(j == w ? "%d\n" : "%d ", ans[i][j]);
}
