#include <bits/stdc++.h>
using namespace std;
int n, g[100005], acc[2][100005], pos[2][200005];
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> g[i];
    g[i]--;
  }
  acc[0][0] = 0;
  acc[1][0] = 0;
  for (int i = 0; i <= 2 * n; i++) {
    pos[0][i] = 1000006;
    pos[1][i] = 1000006;
  }
  int ganhador = g[n], perdedor = (ganhador + 1) % 2;
  for (int i = 1; i <= n; i++) {
    acc[g[i]][i] = acc[g[i]][i - 1] + 1;
    acc[(g[i] + 1) % 2][i] = acc[(g[i] + 1) % 2][i - 1];
    pos[g[i]][acc[g[i]][i]] = i;
  }
  vector<pair<int, int> > possibilidades;
  for (int tamset = 1; tamset <= n; tamset++) {
    if (pos[ganhador][tamset] == 1000006 && pos[perdedor][tamset] == 1000006)
      break;
    int ultimapos = 0, setsg = 0, setsp = 0, accg, accp;
    while (ultimapos < n) {
      accg = acc[ganhador][ultimapos];
      accp = acc[perdedor][ultimapos];
      if (pos[ganhador][accg + tamset] < pos[perdedor][accp + tamset]) {
        ultimapos = pos[ganhador][accg + tamset];
        setsg++;
      } else if (pos[ganhador][accg + tamset] > pos[perdedor][accp + tamset]) {
        ultimapos = pos[perdedor][accp + tamset];
        setsp++;
      } else {
        break;
      }
    }
    if (ultimapos == n && setsg > setsp)
      possibilidades.push_back(make_pair(setsg, tamset));
  }
  sort(possibilidades.begin(), possibilidades.end());
  cout << possibilidades.size() << endl;
  for (int i = 0; i < possibilidades.size(); i++) {
    cout << possibilidades[i].first << " ";
    cout << possibilidades[i].second << endl;
  }
  return 0;
}
