#include <bits/stdc++.h>
using namespace std;
bool Check(vector<vector<int> > ans) {
  int r = ans.size();
  int c = ans[0].size();
  for (int i = 0; i < r; ++i) {
    set<int> avail;
    for (int j = 0; j < c; ++j) {
      if (avail.find(ans[i][j]) == avail.end()) {
        avail.insert(ans[i][j]);
      } else {
        return false;
      }
    }
  }
  for (int i = 0; i < c; ++i) {
    set<int> avail;
    for (int j = 0; j < r; ++j) {
      if (avail.find(ans[j][i]) == avail.end()) {
        avail.insert(ans[j][i]);
      } else {
        return false;
      }
    }
  }
  return true;
}
int main() {
  ios::sync_with_stdio(false);
  int n, x;
  while (cin >> n) {
    map<int, int> cnt;
    for (int i = 0; i < n; ++i) {
      cin >> x;
      ++cnt[x];
    }
    int max_ans = 0;
    int r, c;
    vector<int> cnt_all;
    for (const auto &mi : cnt) {
      cnt_all.push_back(mi.second);
    }
    sort(cnt_all.begin(), cnt_all.end());
    int sum = 0;
    for (int i = 1; i * i <= n; ++i) {
      sum += cnt_all.end() - (lower_bound(cnt_all.begin(), cnt_all.end(), i));
      int tmpr = i;
      int tmpc = sum / i;
      if (tmpr > tmpc) {
        continue;
      }
      if (max_ans < tmpr * tmpc) {
        max_ans = tmpr * tmpc;
        r = tmpr;
        c = tmpc;
      }
      if (max_ans == n) {
        break;
      }
    }
    cout << max_ans << endl;
    cout << r << " " << c << endl;
    vector<vector<int> > ans(r, vector<int>(c, 0));
    int x = 0, y = 0, p = 0;
    int remain = max_ans;
    vector<pair<int, int> > cnt_pair;
    for (auto mi : cnt) {
      int idx = mi.first;
      int need = min(mi.second, r);
      cnt_pair.push_back(pair<int, int>(need, idx));
    }
    sort(cnt_pair.begin(), cnt_pair.end(),
         [](const pair<int, int> &a, const pair<int, int> &b) -> bool {
           return a.first > b.first;
         });
    for (auto pr : cnt_pair) {
      int idx = pr.second;
      int need = pr.first;
      while (need-- && remain > 0) {
        ans[x][y] = idx;
        --remain;
        ++x, ++y;
        if (x >= r) {
          y = ++p;
          x = 0;
        }
        y %= c;
      }
    }
    for (auto x : ans) {
      for (auto y : x) {
        cout << y << " ";
      }
      cout << endl;
    }
  }
  return 0;
}
