#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
const int mx = 2e5 + 9;
int game[2][mx];
int f_occ[2][mx];
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    x--;
    game[x][i]++;
  }
  memset(f_occ, -1, sizeof f_occ);
  for (auto x : {0, 1}) {
    for (int i = 1; i <= n; i++) {
      game[x][i] += game[x][i - 1];
      if (f_occ[x][game[x][i]] != -1) continue;
      f_occ[x][game[x][i]] = i;
    }
  }
  vector<pii> ans;
  for (int t = 1; t <= n; t++) {
    int s = 0;
    int last[] = {0, 0};
    int win[] = {0, 0};
    int idx = 0;
    int latest = -1;
    while (true) {
      int next[] = {0, 0};
      for (auto x : {0, 1}) next[x] = last[x] + t;
      int f[] = {0, 0};
      for (auto x : {0, 1}) f[x] = f_occ[x][next[x]];
      if (f[0] == -1 and f[1] == -1) break;
      if (f[0] == -1) {
        last[0] = game[0][f[1]];
        last[1] = game[1][f[1]];
        idx = f[1];
        win[1]++;
        latest = 1;
        continue;
      }
      if (f[1] == -1) {
        last[0] = game[0][f[0]];
        last[1] = game[1][f[0]];
        idx = f[0];
        win[0]++;
        latest = 0;
        continue;
      }
      if (f[0] < f[1]) {
        last[0] = game[0][f[0]];
        last[1] = game[1][f[0]];
        idx = f[0];
        win[0]++;
        latest = 0;
      } else {
        last[0] = game[0][f[1]];
        last[1] = game[1][f[1]];
        idx = f[1];
        win[1]++;
        latest = 1;
      }
    }
    if (idx != n) continue;
    if (win[0] == win[1]) continue;
    if (win[latest] < win[1 - latest]) continue;
    s = win[latest];
    ans.emplace_back(s, t);
  }
  sort(ans.begin(), ans.end());
  printf("%d\n", (int)ans.size());
  for (auto [s, t] : ans) {
    printf("%d %d\n", s, t);
  }
}
