#include <bits/stdc++.h>
using namespace std;
void base() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
}
typedef long double TD;
typedef pair<TD, TD> Pt;
const TD EPS = 1e-9;
const TD maxD = 1e9;
TD cross(Pt a, Pt b, Pt c) {
  TD v1 = a.first - c.first;
  TD v2 = a.second - c.second;
  TD u1 = b.first - c.first;
  TD u2 = b.second - c.second;
  return v1 * u2 - v2 * u1;
}
TD cross(Pt a, Pt b) { return a.first * b.second - a.second * b.first; }
TD dot(Pt a, Pt b, Pt c) {
  TD v1 = a.first - c.first;
  TD v2 = a.second - c.second;
  TD u1 = b.first - c.first;
  TD u2 = b.second - c.second;
  return v1 * u1 + v2 * u2;
}
TD dot(Pt a, Pt b) { return a.first * b.first + a.second * b.second; }
TD dist(Pt a, Pt b) {
  return sqrt((a.first - b.first) * (a.first - b.first) +
              (a.second - b.second) * (a.second - b.second));
}
vector<Pt> createConvexHull(vector<Pt> &points) {
  sort(points.begin(), points.end());
  vector<Pt> ret;
  for (int i = 0; i < points.size(); i++) {
    while (ret.size() > 1 &&
           cross(points[i], ret[ret.size() - 1], ret[ret.size() - 2]) < -EPS)
      ret.pop_back();
    ret.push_back(points[i]);
  }
  for (int i = points.size() - 2, sz = ret.size(); i >= 0; i--) {
    while (ret.size() > sz &&
           cross(points[i], ret[ret.size() - 1], ret[ret.size() - 2]) < -EPS)
      ret.pop_back();
    if (i == 0) break;
    ret.push_back(points[i]);
  }
  return ret;
}
bool ccw(Pt p, Pt q, Pt r) {
  return cross({q.first - p.first, q.second - p.second},
               {r.first - p.first, r.second - p.second}) > 0;
}
vector<Pt> ps, res;
void solve() {
  int n;
  TD pp, qq;
  cin >> n >> pp >> qq;
  TD mx = 0.0, my = 0.0;
  set<Pt> ms;
  for (int i = 0; i < n; ++i) {
    TD x, y;
    cin >> x >> y;
    if (ms.find({x, y}) == ms.end()) ps.push_back({x, y});
    ms.insert({x, y});
    mx = max(mx, x);
    my = max(my, y);
  }
  ps.push_back({-1, -1});
  ps.push_back({0, my});
  ps.push_back({mx, 0});
  res = createConvexHull(ps);
  TD fgr = atan2(qq, pp);
  for (int i = 0; i < res.size(); i++) {
    int j = (i + 1) % res.size();
    if (res[i].first < 0 && res[i].second < 0) continue;
    if (res[j].first < 0 && res[j].second < 0) continue;
    TD gr1 = atan2(res[i].second, res[i].first);
    TD gr2 = atan2(res[j].second, res[j].first);
    Pt r1 = res[i], r2 = res[j];
    if (gr1 == fgr) {
      cout << fixed << setprecision(18) << max(pp / r1.first, qq / r1.second)
           << "\n";
      return;
    }
    if (gr2 == fgr) {
      cout << fixed << setprecision(18) << max(pp / r2.first, qq / r2.second)
           << "\n";
      return;
    }
    if (gr1 > gr2) {
      swap(gr1, gr2);
      swap(r1, r2);
    }
    if (gr1 <= fgr && fgr <= gr2) {
      TD l = 0, r = 1e12;
      Pt ans = {0, 0};
      for (int k = 0; k < 100; ++k) {
        TD m = (l + r) / 2.0;
        Pt tar = {m * cos(fgr), m * sin(fgr)};
        bool re = ccw(r1, r2, tar);
        if (re) {
          ans = tar;
          l = m;
        } else {
          r = m;
        }
      }
      cout << fixed << setprecision(18) << max(pp / ans.first, qq / ans.second)
           << "\n";
    }
  }
}
int main() {
  base();
  int t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
