// Incorrect greedy algorithm #include #include #include using namespace std; using ll = long long; const ll INF = 1e18; ll cm, cd, cc, cl, cx, cv, ci; map p[4]; void add(map &p, ll c1, ll c2, char r1, char r2) { ll a = min(c1, c2 / 3); p[string(1, r1) + string(3, r2)] = a; c1 -= a; c2 -= 3 * a; p[string(3, r2)] = c2 / 3; c2 %= 3; if (c1) { p[string(1, r1) + string(c2, r2)] = 1; c1--; } else { p[string(c2, r2)] = 1; } p[string(1, r1)] += c1; } bool check(ll k) { ll um = cm, uc = cc, ux = cx; for (int i = 0; i < 4; i++) p[i].clear(); ll min_vi = max(cv, (ci - k + 1) / 2); if (min_vi > k) return false; ll max_ix = min(ci, cx); ll best_vi = max(min_vi, k - max_ix); add(p[0], cv, ci - (k - best_vi), 'V', 'I'); p[0]["IX"] = k - best_vi; ux -= k - best_vi; ll min_lx = max(cl, (ux - k + 1) / 2); if (min_lx > k) return false; ll max_xc = min(ux, cc); ll best_lx = max(min_lx, k - max_xc); add(p[1], cl, ux - (k - best_lx), 'L', 'X'); p[1]["XC"] = k - best_lx; uc -= k - best_lx; ll min_dc = max(cd, (uc - k + 1) / 2); if (min_dc > k) return false; ll max_cm = min(uc, cm); ll best_dc = max(min_dc, k - max_cm); add(p[2], cd, uc - (k - best_dc), 'D', 'C'); p[2]["CM"] = k - best_dc; um -= k - best_dc; if (um > 3 * k) return false; p[3]["MMM"] = um / 3; p[3][string(um % 3, 'M')] = 1; return true; } int main() { cin >> cm >> cd >> cc >> cl >> cx >> cv >> ci; ll k = 0; for (ll b = INF; b >= 1; b /= 2) { while (!check(k + b)) k += b; } cout << k + 1 << "\n"; check(k + 1); for (int i = 0; i < 4; i++) p[i][""] = 0; vector> answer; string r[4]; ll u[4] = {0}; while (true) { for (int i = 0; i < 4; i++) { while (u[i] == 0 && p[i].size()) { auto it = p[i].begin(); r[i] = it->first; u[i] = it->second; p[i].erase(it); } if (u[i] == 0) {u[i] = INF; r[i] = "";} } ll uu = min(min(u[0], u[1]), min(u[2], u[3])); for (int i = 0; i < 4; i++) u[i] -= uu; string rr = r[3] + r[2] + r[1] + r[0]; if (rr == "") break; answer.push_back({rr, uu}); } cout << answer.size() << "\n"; for (auto a : answer) { cout << a.first << " " << a.second << "\n"; } }