#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int d[maxn];
int n;
int p[maxn][2];
int e = 0;
int po1[maxn];
int num1[maxn];
int po2[maxn];
int num2[maxn];
struct Node {
  int s, t;
  Node() {}
  Node(int a, int b) : s(a), t(b) {}
} node[maxn];
int f = 0;
bool cmp(const Node& a, const Node& b) {
  if (a.s < b.s)
    return true;
  else if (a.s == b.s)
    return a.t < b.t;
  else
    return false;
}
int main() {
  scanf("%d", &n);
  int a1 = 0, a2 = 0;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &d[i]);
    if (d[i] == 1) {
      a1++;
      if (a1 > a2) {
        p[e][0] = a1;
        p[e++][1] = i;
      }
    } else {
      a2++;
      if (a2 > a1) {
        p[e][0] = a2;
        p[e++][1] = i;
      }
    }
  }
  a1 = a2 = 0;
  for (int i = 1; i <= n; i++) {
    if (d[i] == 1) {
      a1++;
      po1[a1] = i;
    } else {
      a2++;
      po2[a2] = i;
    }
    num1[i] = a1;
    num2[i] = a2;
  }
  int s1, s2;
  for (int i = 0; i < e; i++) {
    a1 = num1[p[i][1]];
    a2 = num2[p[i][1]];
    if (a1 == p[i][0]) {
      s1 = 1;
      s2 = 0;
      if (po1[a1] == n) {
        node[f++] = Node(s1, p[i][0]);
        continue;
      }
    } else {
      s1 = 0;
      s2 = 1;
      if (po2[a2] == n) {
        node[f++] = Node(s2, p[i][0]);
        continue;
      }
    }
    while (1) {
      if (a1 + p[i][0] > num1[n] && a2 + p[i][0] > num2[n]) break;
      if (num2[po1[a1 + p[i][0]]] - a2 < p[i][0] && d[po1[a1 + p[i][0]]] == 1 &&
          a1 + p[i][0] <= num1[n]) {
        s1++;
        a1 += p[i][0];
        a2 = num2[po1[a1]];
        if (po1[a1] == n) {
          if (s1 > s2) {
            node[f++] = Node(s1, p[i][0]);
          }
          break;
        }
        continue;
      }
      if (num1[po2[a2 + p[i][0]]] - a1 < p[i][0] && d[po2[a2 + p[i][0]]] == 2 &&
          a2 + p[i][0] <= num2[n]) {
        s2++;
        a2 += p[i][0];
        a1 = num1[po2[a2]];
        if (po2[a2] == n) {
          if (s2 > s1) {
            node[f++] = Node(s2, p[i][0]);
          }
          break;
        }
      }
    }
  }
  sort(node, node + f, cmp);
  cout << f << endl;
  for (int i = 0; i < f; i++) cout << node[i].s << " " << node[i].t << endl;
  return 0;
}
