#include using namespace std; using i64 = long long; list> merge(list> a, list> b) { list> c; while (!a.empty() && !b.empty()) { auto [s,m] = *begin(a); auto [t,n] = *begin(b); i64 take = min(m,n); c.emplace_back(s+t, take); begin(a)->second -= take; if (begin(a)->second == 0) a.pop_front(); begin(b)->second -= take; if (begin(b)->second == 0) b.pop_front(); } return c; } struct number_list { i64 n; list> count; // add the suffix s at all indices k with i <= k < j void add_suffix(string s, i64 i, i64 j) { count = merge(count, {{"",i}, {s,j-i}, {"",n-j}}); count.remove_if([](auto pr) { return pr.second == 0; }); } }; i64 M, D, C, L, X, V, I; list> solve(i64 n) { map tiles = {{'M',M}, {'D',D}, {'C',C}, {'L',L}, {'X',X}, {'V',V}, {'I',I}}; bool valid = true; number_list res = {n, {{"",n}}}; auto step = [&](char one, char five, char ten) { i64 nines = tiles[ten]; if (nines > min(tiles[one],n)) { valid = false; return; } tiles[one] -= nines, tiles.erase(ten); res.add_suffix(string({one,ten}), n-nines, n); i64 rem = n-nines, fives = tiles[five]; if (fives > rem) { valid = false; return; } tiles.erase(five); res.add_suffix(string({five}), 0, fives); if (tiles[one] <= 3*rem) { i64 threes = tiles[one]/3; res.add_suffix(string({one,one,one}), 0, threes); if (tiles[one]%3 != 0) { res.add_suffix(string(tiles[one]%3,one), threes, threes+1); } tiles.erase(one); } else { res.add_suffix(string({one,one,one}), 0, rem); tiles[one] -= 3*rem; } }; step('M','!','?'); step('C','D','M'); step('X','L','C'); step('I','V','X'); if (tiles['I'] > 0) valid = false; if (valid) return res.count; else return {}; } int main() { cin >> M >> D >> C >> L >> X >> V >> I; i64 lo = 0, hi = 1e18; list> res; while (hi-lo > 1) { i64 mi = (lo+hi)/2; res = solve(mi); (res.empty() ? lo : hi) = mi; } res = solve(hi); cout << hi << endl; cout << res.size() << endl; for (auto [num,c]: res) { cout << num << " " << c << endl; } }