#include <bits/stdc++.h>
using namespace std;
const long double eps = 1e-9;
const long double PI = atan2((long double)0, (long double)-1);
const long long MOD = 1000000007;
const int INF = 1 << 30;
const int ARR_INF = 1 << 6;
const int MAXN = 100005;
struct point {
  long double x, y;
  point(long double _x = 0.0, long double _y = 0.0) {
    x = _x;
    y = _y;
  }
  point operator+(const point &b) const { return point(x + b.x, y + b.y); }
  point operator-(const point &b) const { return point(x - b.x, y - b.y); }
  point operator|(const long double &b) const { return point(x * b, y * b); }
  long double operator*(const point &b) const { return x * b.x + y * b.y; }
  long double operator^(const point &b) const { return x * b.y - y * b.x; }
  bool operator<(const point &b) const {
    if (x == b.x) return y < b.y;
    return x < b.x;
  }
  void input() {
    double _x, _y;
    scanf("%lf%lf", &_x, &_y);
    x = (long double)_x;
    y = (long double)_y;
  }
  void output() { printf("%.6f %.6f\n", (double)x, (double)y); }
} pnt[MAXN], res[MAXN];
int n, p, q;
long double ans;
map<pair<int, int>, int> mp;
int Sgn(long double x) { return (x > eps) - (x < -eps); }
int Graham() {
  sort(pnt, pnt + n);
  if (n == 0) return 0;
  res[0] = pnt[0];
  if (n == 1) return 1;
  res[1] = pnt[1];
  if (n == 2) return 2;
  res[2] = pnt[2];
  int top = 1;
  for (int i = 2; i < n; i++) {
    while (top && Sgn((pnt[i] - res[top - 1]) ^ (res[top] - res[top - 1])) >= 0)
      top--;
    res[++top] = pnt[i];
  }
  int len = top;
  res[++top] = pnt[n - 2];
  for (int i = n - 3; i >= 0; i--) {
    while (top != len &&
           Sgn((pnt[i] - res[top - 1]) ^ (res[top] - res[top - 1])) >= 0)
      top--;
    res[++top] = pnt[i];
  }
  return top;
}
point Get_Intersection(point a, point b, point c, point d) {
  b = b - a;
  d = d - c;
  c = a - c;
  return a + (b | ((d ^ c) / (b ^ d)));
}
void Check(int a, int b) {
  point pa = res[a], pb = res[b];
  point line((long double)p, (long double)q);
  if (Sgn(line ^ pa) * Sgn(line ^ pb) > 0) return;
  if (Sgn(line ^ pa) * Sgn(line ^ pb) < 0) {
    point pt = Get_Intersection(pa, pb, point(), line);
    if ((long double)p / pt.x < ans) ans = (long double)p / pt.x;
    return;
  }
  if (Sgn(line ^ pa) == 0) {
    if ((long double)p / pa.x < ans) ans = (long double)p / pa.x;
  }
  if (Sgn(line ^ pb) == 0) {
    if ((long double)p / pb.x < ans) ans = (long double)p / pb.x;
  }
  return;
}
int main() {
  while (scanf("%d%d%d", &n, &p, &q) != EOF) {
    mp.clear();
    int a, b, maxa = 0, maxb = 0;
    int cnt = 0;
    while (n--) {
      scanf("%d%d", &a, &b);
      if (a > maxa) maxa = a;
      if (b > maxb) maxb = b;
      pair<int, int> pt = make_pair(a, b);
      if (!mp[pt]) {
        pnt[cnt++] = point((long double)a, (long double)b);
        mp[pt]++;
      }
    }
    pnt[cnt++] = point((long double)maxa, (long double)0);
    pnt[cnt++] = point((long double)0, (long double)maxb);
    n = cnt;
    int m = Graham();
    ans = (long double)INF;
    for (int i = 0; i < m; i++) Check(i, (i + 1) % m);
    printf("%.15f\n", (double)ans);
  }
  return 0;
}
