#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:5000000000")
const long long mod = 1000000007;
int Inf = (int)2e9;
long long LINF = (long long)1e18 + 1e17;
using namespace std;
map<int, int> cnt;
vector<int> b;
int check(int row) {
  int can = 0;
  for (int(i) = 0; (i) < b.size(); (i)++) {
    can += min(b[i], row);
  }
  return can;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  for (int(i) = 0; (i) < n; (i)++) {
    int x;
    cin >> x;
    cnt[x]++;
  }
  for (auto(it) = (cnt).begin(); (it) != (cnt).end(); (it)++) {
    b.push_back(it->second);
  }
  int row = 1, col = 1;
  for (int i = 1; i * i <= n; i++) {
    int can = check(i);
    int j = can / i;
    if (i * j > row * col && j >= i) {
      row = i, col = j;
    }
  }
  cout << row * col << endl;
  cout << row << " " << col << endl;
  vector<vector<int>> ans(row, vector<int>(col));
  deque<int> a;
  for (auto(it) = (cnt).begin(); (it) != (cnt).end(); (it)++) {
    int x = min(it->second, row);
    for (int(i) = 0; (i) < x; (i)++) {
      if (x == row)
        a.push_front(it->first);
      else
        a.push_back(it->first);
    }
    if (a.size() >= row * col) break;
  }
  int id = 0;
  for (int j = 0; j < col; j++) {
    for (int i = 0; i < row; i++) {
      int jj = (j + i) % col;
      ans[i][jj] = a[id];
      id++;
    }
  }
  for (int(i) = 0; (i) < row; (i)++) {
    for (int(j) = 0; (j) < col; (j)++) {
      cout << ans[i][j] << " ";
    }
    cout << endl;
  }
  return 0;
}
