#include <bits/stdc++.h>
using namespace std;
inline int Getint() {
  int Ret = 0;
  char Ch = ' ';
  bool Flag = 0;
  while (!(Ch >= '0' && Ch <= '9')) {
    if (Ch == '-') Flag ^= 1;
    Ch = getchar();
  }
  while (Ch >= '0' && Ch <= '9') {
    Ret = Ret * 10 + Ch - '0';
    Ch = getchar();
  }
  return Flag ? -Ret : Ret;
}
const double EPS = 1e-7, PI = acos(-1.0);
const int N = 100010;
class Point {
 private:
  int x, y;

 public:
  Point() {}
  Point(const int tx, const int ty) { x = tx, y = ty; }
  inline bool operator<(const Point &t) const {
    if (x != t.x) return x > t.x;
    return y < t.y;
  }
  inline bool operator==(const Point &t) const { return x == t.x && y == t.y; }
  inline void Read() { scanf("%d%d", &x, &y); }
  inline int Get(const int t) const { return t ? y : x; }
} arr[N];
int n, p, q;
double ans;
inline void Input() {
  scanf("%d%d%d", &n, &p, &q);
  for (int i = 0; i < n; i++) arr[i].Read();
}
inline long long Multi(const Point &o, const Point &a, const Point &b) {
  long long d1[2], d2[2];
  for (int i = 0; i < 2; i++)
    d1[i] = a.Get(i) - o.Get(i), d2[i] = b.Get(i) - o.Get(i);
  return d1[0] * d2[1] - d1[1] * d2[0];
}
inline void GetHull(Point *arr, int &n) {
  static int index[N];
  int len = 0;
  for (int i = 0; i < n; i++) {
    while (len >= 2 &&
           Multi(arr[index[len - 2]], arr[index[len - 1]], arr[i]) <= 0)
      len--;
    index[len++] = i;
  }
  for (int i = 0; i < len; i++) arr[i] = arr[index[i]];
  n = len;
}
inline bool Cross(const Point &a, const Point &b, const Point &c,
                  const Point &d) {
  long long dir1 = Multi(a, b, c), dir2 = Multi(a, b, d);
  if (!dir1 || !dir2) return 1;
  return (dir1 > 0) ^ (dir2 > 0);
}
inline double Sqr(double x) { return x * x; }
inline double Dist(const Point &a, const Point &b) {
  double ret = 0.0;
  for (int i = 0; i < 2; i++) ret += Sqr(a.Get(i) - b.Get(i));
  return sqrt(ret);
}
inline void Solve() {
  ans = 1.0 * (1000000001);
  for (int i = 0; i < n; i++) {
    double t = max((1.0 * p) / arr[i].Get(0), (1.0 * q) / arr[i].Get(1));
    ans = min(ans, t);
  }
  int mx1 = 0, mx2 = 0;
  for (int i = 0; i < n; i++)
    mx1 = max(mx1, arr[i].Get(0)), mx2 = max(mx2, arr[i].Get(1));
  arr[n] = Point(mx1, 0), arr[n + 1] = Point(0, mx2);
  n += 2;
  sort(arr, arr + n);
  n = unique(arr, arr + n) - arr;
  GetHull(arr, n);
  Point g = Point(p, q), s = Point(0, 0);
  for (int i = 0; i < n - 1; i++) {
    if (!Cross(s, g, arr[i], arr[i + 1])) continue;
    Point b = arr[i], c = arr[i + 1];
    double bc = Dist(b, c), gc = Dist(g, c), sg = Dist(s, g), sb = Dist(s, b),
           sc = Dist(s, c);
    double cosscb = (Sqr(sc) + Sqr(bc) - Sqr(sb)) / (2.0 * sc * bc),
           coscsg = (Sqr(sc) + Sqr(sg) - Sqr(gc)) / (2.0 * sc * sg);
    double sinscb = sqrt(1 - Sqr(cosscb)), sincsg = sqrt(1 - Sqr(coscsg));
    double sinsxc = sinscb * coscsg + cosscb * sincsg;
    double sx = sinscb * (sc / sinsxc);
    ans = min(ans, sg / sx);
  }
  printf("%.15lf\n", ans);
}
int main() {
  Input();
  Solve();
  return 0;
}
