#include using namespace std; using ll = long long; const ll inf = 10000000000; template class frac{ T bunsi,bunbo; constexpr void setting() noexcept { T g = gcd(bunsi,bunbo); bunsi /= g;bunbo /= g; if(bunbo < 0){ bunsi = -bunsi;bunbo = -bunbo; } } public: constexpr frac(T Bunsi = 0,T Bunbo = 1) noexcept { bunsi = Bunsi;bunbo = Bunbo; setting(); } constexpr T &Bunsi() noexcept {return bunsi;} constexpr const T &Bunsi() const noexcept {return bunsi;} constexpr T &Bunbo() noexcept {return bunbo;} constexpr const T &Bunbo() const noexcept {return bunbo;} constexpr frac &operator+=(const frac &rhs) noexcept { bunsi = bunsi*rhs.bunbo+bunbo*rhs.bunsi; bunbo *= rhs.bunbo; setting(); return *this; } constexpr frac &operator-=(const frac &rhs) noexcept { bunsi = bunsi*rhs.bunbo-bunbo*rhs.bunsi; bunbo *= rhs.bunbo; setting(); return *this; } constexpr frac &operator*=(const frac &rhs) noexcept { bunbo *= rhs.bunbo; bunsi *= rhs.bunsi; setting(); return *this; } constexpr frac &operator/=(const frac &rhs) noexcept { bunbo *= rhs.bunsi; bunsi *= rhs.bunbo; setting(); return *this; } constexpr frac &operator+=(const T rhs) noexcept { bunsi = bunsi+bunbo*rhs; setting(); return *this; } constexpr frac &operator-=(const T rhs) noexcept { bunsi = bunsi-bunbo*rhs; setting(); return *this; } constexpr frac &operator*=(const T rhs) noexcept { bunsi *= rhs; setting(); return *this; } constexpr frac &operator/=(const T rhs) noexcept { bunbo *= rhs; setting(); return *this; } constexpr frac operator+(const frac &rhs) const noexcept {return frac(*this) += rhs;} constexpr frac operator-(const frac &rhs) const noexcept {return frac(*this) -= rhs;} constexpr frac operator*(const frac &rhs) const noexcept {return frac(*this) *= rhs;} constexpr frac operator/(const frac &rhs) const noexcept {return frac(*this) /= rhs;} constexpr frac operator+(const T rhs) const noexcept {return frac(*this) += rhs;} constexpr frac operator-(const T rhs) const noexcept {return frac(*this) -= rhs;} constexpr frac operator*(const T rhs) const noexcept {return frac(*this) *= rhs;} constexpr frac operator/(const T rhs) const noexcept {return frac(*this) /= rhs;} constexpr bool operator<(const frac &rhs) const noexcept {return bunsi*rhs.bunbo < bunbo*rhs.bunsi;} constexpr bool operator>(const frac &rhs) const noexcept {return bunsi*rhs.bunbo > bunbo*rhs.bunsi;} constexpr bool operator>=(const frac &rhs) const noexcept {return bunsi*rhs.bunbo >= bunbo*rhs.bunsi;} constexpr bool operator<=(const frac &rhs) const noexcept {return bunsi*rhs.bunbo <= bunbo*rhs.bunsi;} constexpr bool operator==(const frac &rhs) const noexcept {return bunsi*rhs.bunbo == bunbo*rhs.bunsi;} constexpr bool operator!=(const frac &rhs) const noexcept {return bunsi*rhs.bunbo != bunbo*rhs.bunsi;} constexpr bool operator<(const T rhs) const noexcept {return bunsi < bunbo*rhs;} constexpr bool operator>(const T rhs) const noexcept {return bunsi > bunbo*rhs;} constexpr bool operator<=(const T rhs) const noexcept {return bunsi <= bunbo*rhs;} constexpr bool operator>=(const T rhs) const noexcept {return bunsi >= bunbo*rhs;} constexpr bool operator==(const T rhs) const noexcept {return bunsi == bunbo*rhs;} constexpr bool operator!=(const T rhs) const noexcept {return bunsi != bunbo*rhs;} }; template void print(frac &f){ cout << f.Bunsi() << "/" << f.Bunbo() << endl; } using F = long double; pair> Simplex_Method(ll N,ll M,vector C,vector> A,vector B){ assert(C.size() == N && A.size() == M && B.size() == M); for(int i=0;i X(N);//最大値を取る数列x //スラック変数を導入する //M個の条件に対し1つずつスラック変数を用意するので、スラック変数をM個追加 X.resize(N+M); C.resize(N+M); for(int i=0;i Slack(N+M,-1); for(int i=0;i A_Slack(M); for(int i=0;i 0){ target = i;break; } } //もしすべての係数が正でなかったら、操作を終了 if(target == -1) break; //スラック変数の余裕がある限りX[target]を増やす //各条件で増やせる量のminを取れば良い //targetと、minを取る条件のスラック変数をswapするので、その条件のindexも記録する //いくらでも増やせる場合、infを返し操作を終了 F minval = inf; int minitr = -1; for(int i=0;i SubX; copy(X.begin(),X.begin()+N,back_inserter(SubX)); return make_pair(Ans,SubX); } int main(){ cout << fixed << setprecision(10); int C,D;cin >> C >> D; int N = 2,M = 2; vector Ma({1000,2000}); vector> A({{F(3)/4,F(2)/7},{F(1)/4,F(5)/7}}); vector B({F(C),F(D)}); auto ret = Simplex_Method(N,M,Ma,A,B); F ans = ret.first; cout << ans << endl; }