#include <bits/stdc++.h>
using namespace std;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n;
  cin >> n;
  map<int, int> mp;
  for (int i = 0; i < n; i++) {
    int temp;
    cin >> temp;
    mp[temp]++;
  }
  set<pair<int, int> > st;
  for (auto it : mp) {
    st.insert({it.second, it.first});
  }
  mp.clear();
  vector<int> siev(n + 1, 1);
  int i = 1;
  while (i * i <= n) {
    for (int j = i; i * j <= n; j++) {
      siev[i * j] = i;
    }
    i++;
  }
  int ans = n;
  for (; ans > 1; ans--) {
    int a = siev[ans];
    if (a >= (*st.rbegin()).first)
      break;
    else {
      auto temp = *st.rbegin();
      st.erase(temp);
      temp.first--;
      if (temp.first > 0) {
        st.insert(temp);
      }
    }
  }
  int r = siev[ans];
  int c = ans / r;
  vector<int> ls;
  for (auto it : st) {
    for (i = 0; i < it.first; i++) ls.push_back(it.second);
  }
  reverse(ls.begin(), ls.end());
  st.clear();
  vector<vector<int> > mat(r, vector<int>(c));
  int ctr = 0;
  for (int col = 0; col < c; col++) {
    i = 0;
    for (int j = col; i < r; i++, j++) {
      mat[i][j % c] = ls[ctr];
      ctr++;
    }
  }
  cout << ans << endl;
  cout << r << " " << c << endl;
  for (i = 0; i < r; i++) {
    for (int j = 0; j < c; j++) {
      cout << mat[i][j] << " ";
    }
    cout << "\n";
  }
  return 0;
}
