#include <bits/stdc++.h>
using namespace std;
enum LOC {
  to_left,
  to_right,
};
struct Info {
  bool operator<(const struct Info &arg) const {
    return per_time < arg.per_time;
  };
  int id, per_time, sum_time, rest_count;
  double position, pre_pos;
  LOC loc, pre_loc;
};
int N;
LOC most_slow_loc;
int most_slow_id, most_slow_sum_time, most_slow_per_time;
void func() {
  vector<Info> V;
  for (int i = 0; i < N; i++) {
    Info info;
    scanf("%d %d", &info.per_time, &info.rest_count);
    info.sum_time = 0;
    info.loc = to_left;
    info.id = i;
    info.position = 0;
    V.push_back(info);
  }
  sort(V.begin(), V.end());
  int num = N;
  int ans = 0;
  for (int time = 1; time <= 160000; time++) {
    if (V.size() == 1) {
      V[0].position = (double)(time - V[0].sum_time) / (double)V[0].per_time;
      if (V[0].position >= 1.0) {
        V[V.size() - 1].sum_time = time;
        V[V.size() - 1].position = 0;
        if (V[V.size() - 1].loc == to_left) {
          V[V.size() - 1].loc = to_right;
        } else {
          V[V.size() - 1].rest_count -= 1;
          if (V[V.size() - 1].rest_count == 0) {
            ans = time;
            V.erase(V.begin() + V.size() - 1);
            num--;
          } else {
            V[V.size() - 1].loc = to_left;
          }
        }
      }
    } else {
      for (int i = V.size() - 1; i >= 0; i--) {
        V[i].pre_pos = V[i].position;
        V[i].pre_loc = V[i].loc;
        V[i].position = (double)(time - V[i].sum_time) / (double)V[i].per_time;
      }
      for (int i = V.size() - 2; i >= 0; i--) {
        for (int k = i + 1; k < V.size(); k++) {
          if (V[i].pre_loc == V[k].pre_loc && V[i].loc == V[k].loc &&
              V[i].pre_pos < V[k].pre_pos) {
            if (V[i].position > V[k].position) {
              if (V[k].position >= 1.0) {
              } else {
                V[i].position = V[k].position - 0.000000001;
              }
            }
          }
        }
        if (V[i].position >= 1.0) {
          V[i].sum_time = time;
          V[i].position = 0.0;
          if (V[i].loc == to_left) {
            V[i].loc = to_right;
          } else {
            V[i].rest_count -= 1;
            if (V[i].rest_count == 0) {
              ans = time;
              V.erase(V.begin() + i);
              num--;
            } else {
              V[i].loc = to_left;
            }
          }
        }
      }
      if (V[V.size() - 1].position >= 1.0) {
        V[V.size() - 1].sum_time = time;
        V[V.size() - 1].position = 0;
        if (V[V.size() - 1].loc == to_left) {
          V[V.size() - 1].loc = to_right;
        } else {
          V[V.size() - 1].rest_count -= 1;
          if (V[V.size() - 1].rest_count == 0) {
            ans = time;
            V.erase(V.begin() + V.size() - 1);
            num--;
          } else {
            V[V.size() - 1].loc = to_left;
          }
        }
      }
    }
    if (num == 0) break;
  }
  printf("%d\n", ans);
}
int main() {
  while (true) {
    scanf("%d", &N);
    if (N == 0) break;
    func();
  }
  return 0;
}
