#include <bits/stdc++.h>   using namespace std;   const double EPS = 1e-9;   const double PI = 3.141592653589793;   long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }   struct Pt {     double x, y;     Pt(double a = 0, double b = 0) : x(a), y(b) {}     bool operator==(const Pt& p) const { return p.x == x && p.y == y; }     bool operator<(const Pt& p) const { return x == p.x ? y > p.y : x < p.x; }     Pt operator-(const Pt& p) const { return {x - p.x, y - p.y}; }     Pt operator+(const Pt& p) const { return {x + p.x, y + p.y}; }     Pt operator/(const double c) const { return {x / c, y / c}; }     Pt operator*(const double c) const { return {x * c, y * c}; }     Pt vetor(const Pt& o) const { return o - (*this); }     double dot(const Pt& b) const { return (x * b.x) + (y * b.y); }     double sq() const { return (x * x) + (y * y); }     double dist(const Pt& b) { return sqrt((b - *this).sq()); }     double cross(const Pt& b) const { return (x * b.y) - (y * b.x); }     double cross(const Pt& a, const Pt& b) const {       return (a - *this).cross(b - *this);     }     double angle(Pt& a, Pt& b) const {       a = vetor(a), b = vetor(b);       return acos(1.0 * a.dot(b) / sqrt(1.0 * a.dot(a) * b.dot(b)));     }   } pts[101000];   Pt obj;   Pt perp(Pt p) { return {-p.y, p.x}; }   ostream& operator<<(ostream& os, Pt p) {     return os <<  (  << p.x <<  ,  << p.y <<  ) ;   }   template <typename F>   int sgn(F x) {     return (F(0) < x) - (x < F(0));   }   struct Line {     double A, B, C;     Line() {}     Line(const Pt& de, const Pt& pa) {       A = de.y - pa.y;       B = pa.x - de.x;       C = -A * de.x - B * de.y;     }   };   bool mORe(double a, double b) { return a <= b || fabs(a - b) <= EPS; }   struct Seg {     Pt A, B;     Seg() {}     Seg(Pt a, Pt b) : A(a), B(b) {       if (B < A) swap(A, B);     }     bool inDouble(const Pt& Pt) {       return mORe(min(A.x, B.x), Pt.x) && mORe(Pt.x, max(A.x, B.x)) &&              mORe(min(A.y, B.y), Pt.y) && mORe(Pt.y, max(A.y, B.y));     }     bool inter(Seg& o, Pt& res) {       Line l1 = Line(A, B), l2 = Line(o.A, o.B);       double dx = Pt(l1.C, l1.B).cross(Pt(l2.C, l2.B));       double dy = Pt(l1.A, l1.C).cross(Pt(l2.A, l2.C));       double d = Pt(l1.A, l1.B).cross(Pt(l2.A, l2.B));       if (d == 0) return false;       res = Pt(-dx / d, -dy / d);       if (!inDouble(res) || !o.inDouble(res)) return false;       return true;     }   };   int n, p, q;   void solve() {     vector<Pt> chain;     int sz = 0;     for (int i = 0; i < n; i++) {       while (sz >= 2 && chain[sz - 2].cross(chain[sz - 1], pts[i]) >= 0)         chain.pop_back(), sz--;       chain.emplace_back(pts[i]);       sz++;     }     vector<Seg> linhas;     for (int i = 1; i < chain.size(); i++) {       linhas.emplace_back(chain[i - 1], chain[i]);     }     Seg teste = {Pt(0, 0), obj * 1000002.0};     for (Seg linha : linhas) {       Pt res;       if (linha.inter(teste, res)) {         printf( %.12f n , max(obj.x / res.x, obj.y / res.y));         return;       }     }   }   int main() {     scanf( %d%d%d , &n, &p, &q);     obj = {(double)p, (double)q};     int x, y;     int maxx = 0, maxy = 0;     for (int i = 0; i < n; i++) {       scanf( %d%d , &x, &y);       pts[i] = {(double)x, (double)y};       maxx = max(maxx, x);       maxy = max(maxy, y);     }     pts[n] = {0.0, (double)maxy};     pts[n + 1] = {(double)maxx, 0.0};     n += 2;     sort(pts, pts + n);     solve();     return 0;   }