#include <bits/stdc++.h>
using namespace std;
double t[60];
struct pp {
  int num, c;
  double t, pos;
  bool operator<(pp xx) const {
    if (xx.c == 0) return 1;
    if (c == 0) return 0;
    if (pos == xx.pos) return t > xx.t;
    return pos < xx.pos;
  }
} a[60];
int n;
double now, v[60];
queue<double> q;
int main() {
  while (1) {
    scanf("%d", &n);
    if (!n) return 0;
    for (int i = 1; i <= n; i++) {
      scanf("%lf%d", &a[i].t, &a[i].c);
      a[i].c++;
      a[i].num = i;
      v[a[i].num] = a[i].t;
      a[i].pos = 0;
    }
    sort(a + 1, a + n + 1);
    q.push(0);
    double ans = 0;
    while (!q.empty()) {
      double t = q.front();
      ans += t;
      q.pop();
      for (int i = 1; i <= n; i++)
        if (a[i].c) {
          a[i].pos += t / a[i].t;
        }
      for (int i = 1; i < n; i++)
        if (a[i + 1].c && abs(a[i].pos - a[i + 1].pos) < (1e-8)) {
          a[i].t = max(a[i].t, a[i + 1].t);
        }
      for (int i = 1; i <= n; i++)
        if (a[i].c) {
          while (a[i].pos >= 2) a[i].pos -= 2;
        }
      for (int i = 1; i <= n; i++)
        if (a[i].c) {
          if (a[i].pos < (1e-8)) a[i].c -= 1;
        }
      for (int i = 1; i <= n; i++)
        if (a[i].c)
          if (a[i].pos < (1e-8) || abs(a[i].pos - 1) < (1e-8)) {
            a[i].t = v[a[i].num];
          }
      double tt = 20;
      sort(a + 1, a + n + 1);
      for (int i = 1; i <= n; i++)
        if (a[i].c) {
          double t2 = 0;
          if (a[i].pos > 1 - (1e-8))
            t2 = (2 - a[i].pos) * a[i].t;
          else
            t2 = (1 - a[i].pos) * a[i].t;
          tt = min(tt, t2);
        }
      for (int i = 2; i <= n; i++)
        if (a[i].c) {
          if (a[i].t > a[i - 1].t && a[i].pos > a[i - 1].pos) {
            tt = min(tt, (a[i].pos - a[i - 1].pos) /
                             (1. / a[i - 1].t - 1. / a[i].t));
          }
        }
      if (tt != 20) q.push(tt);
    }
    printf("%d\n", (int)round(ans));
  }
}
