#include #include #include #include #include #include #include using std::cout; using std::cerr; using std::endl; long long gcd(long long a, long long b){ return b==0 ? a : gcd(b, a%b); } struct Fraction { long long a,b; Fraction(long long a_=0, long long b_=1) : a(a_), b(b_) { auto g = gcd(a, b); a/=g, b/=g; if(b < 0) a = -a, b = -b; } }; Fraction operator+(const Fraction& l, const Fraction& r){ return {l.a*r.b + l.b*r.a, l.b*r.b}; } Fraction& operator+=(Fraction& l, const Fraction& r){ return l=l+r; } Fraction operator-(const Fraction& l, const Fraction& r){ return {l.a*r.b - l.b*r.a, l.b*r.b}; } Fraction operator*(const Fraction& l, const Fraction& r){ return {l.a*r.a, l.b*r.b}; } Fraction operator/(const Fraction& l, const Fraction& r){ return {l.a*r.b, l.b*r.a}; } bool operator<(const Fraction& l, const Fraction& r){ return l.a*r.b < l.b*r.a; } bool operator==(const Fraction& l, const Fraction& r){ return l.a*r.b == l.b*r.a; } std::ostream& operator<<(std::ostream& o, const Fraction& f) { return o << f.a << " / " << f.b; } std::vector binom(Fraction f, int k){ if(k==0) return {{1}}; std::vector v; for(auto x : binom(f, k-1)) v.push_back(x*f), v.push_back(x*(1-f)); return v; } int main(){ // Given a/b, make c/d long long a,b,c,d; std::cin >> a >> b >> c >> d; b+=a, d+=c; for(int k = 1; k < 5; ++k){ //cerr << "F: " << Fraction{a, b} << endl; auto v = binom({a,b}, k); //sort(begin(v), end(v)); assert(v.size() == 1<