#include #include #define rep(E, F) for (E = 0; E < (F); E++) #define per(E, F) for (E = (F) - 1; E >= 0; E--) #define MAXS 1000000 typedef long long ll; typedef struct { ll x, y; } par; ll min(ll a, ll b) { if (a > b) return b; return a; } ll max(ll a, ll b) { if (a < b) return b; return a; } par topar(ll x, ll y) { par r = {x, y}; return r; } ll get_int() { ll r = 0, c = getchar(), s = 1; while (c != '-' && c < '0' || c > '9') c = getchar(); while (c == '-') s *= -1, c = getchar(); while (c >= '0' && c <= '9') r = r*10 + c - '0', c = getchar(); return s*r; } ll m; par g[MAXS]; ll foo(ll *a, ll n) { ll i, mm, t = 0, x, y, b[7]; m = 0; rep(i, 7) b[i] = a[i]; x = min(b[0]/3, n); if (x != 0) g[m++] = topar(3000, x), t += x, b[0] -= 3*x; if (x < n && b[0] != 0) t++, g[m++] = topar(1000*b[0], 1), b[0] = 0; if (b[2] < b[0]) return 0; mm = m; rep(i, mm) { if (b[0] == 0) break; if (b[0] < g[i].y) { g[i].y -= b[0]; g[m++] = topar(g[i].x + 900, b[0]); b[2] -= b[0], b[0] = 0; } else g[i].x += 900, b[0] -= g[i].y, b[2] -= g[i].y; } if (b[0] != 0) return 0; mm = m; rep(i, mm) if (g[i].x%1000 != 900) { if (b[1] == 0) break; if (b[1] < g[i].y) { g[i].y -= b[1]; g[m++] = topar(g[i].x + 500, b[1]); b[1] = 0; } else g[i].x += 500, b[1] -= g[i].y; } if (b[1] > n - t) return 0; if (b[1] != 0) g[m++] = topar(500, b[1]), t += b[1], b[1] = 0; mm = m; rep(i, mm) if (g[i].x%1000 != 900) { if (b[2] == 0) break; y = b[2]/3; if (y == 0 && g[i].y == 1) g[i].x += 100*b[2], b[2] = 0; else if (y == 0) { g[i].y--; g[m++] = topar(g[i].x + 100*b[2], 1); b[2] = 0; } else if (y < g[i].y) { g[i].y -= y; g[m++] = topar(g[i].x + 300, y); b[2] -= 3*y; i--; } else g[i].x += 300, b[2] -= 3*g[i].y; } x = min(b[2]/3, n - t); if (x != 0) g[m++] = topar(300, x), b[2] -= 3*x, t += x; if (t < n && b[2] != 0) g[m++] = topar(b[2]*100, 1), b[2] = 0, t++; if (b[2] > b[4]) return 0; mm = m; rep(i, mm) { if (b[2] == 0) break; if (b[2] < g[i].y) { g[i].y -= b[2]; g[m++] = topar(g[i].x + 90, b[2]); b[4] -= b[2], b[2] = 0; } else g[i].x += 90, b[4] -= g[i].y, b[2] -= g[i].y; } if (b[2] != 0) return 0; mm = m; rep(i, mm) if (g[i].x%100 != 90) { if (b[3] == 0) break; if (b[3] < g[i].y) { g[i].y -= b[3]; g[m++] = topar(g[i].x + 50, b[3]); b[3] = 0; } else g[i].x += 50, b[3] -= g[i].y; } if (b[3] > n - t) return 0; if (b[3] != 0) g[m++] = topar(50, b[3]), t += b[3], b[3] = 0; mm = m; rep(i, mm) if (g[i].x%100 != 90) { if (b[4] == 0) break; y = b[4]/3; if (y == 0 && g[i].y == 1) g[i].x += 10*b[4], b[4] = 0; else if (y == 0) { g[i].y--; g[m++] = topar(g[i].x + 10*b[4], 1); b[4] = 0; } else if (y < g[i].y) { g[i].y -= y; g[m++] = topar(g[i].x + 30, y); b[4] -= 3*y; i--; } else g[i].x += 30, b[4] -= 3*g[i].y; } x = min(b[4]/3, n - t); if (x != 0) g[m++] = topar(30, x), b[4] -= 3*x, t += x; if (t < n && b[4] != 0) g[m++] = topar(b[4]*10, 1), b[4] = 0, t++; if (b[4] > b[6]) return 0; mm = m; rep(i, mm) { if (b[4] == 0) break; if (b[4] < g[i].y) { g[i].y -= b[4]; g[m++] = topar(g[i].x + 9, b[4]); b[6] -= b[4], b[4] = 0; } else g[i].x += 9, b[6] -= g[i].y, b[4] -= g[i].y; } if (b[4] != 0) return 0; mm = m; rep(i, mm) if (g[i].x%10 != 9) { if (b[5] == 0) break; if (b[5] < g[i].y) { g[i].y -= b[5]; g[m++] = topar(g[i].x + 5, b[5]); b[5] = 0; } else g[i].x += 5, b[5] -= g[i].y; } if (b[5] > n - t) return 0; if (b[5] != 0) g[m++] = topar(5, b[5]), t += b[5], b[5] = 0; mm = m; rep(i, mm) if (g[i].x%10 != 9) { if (b[6] == 0) break; y = b[6]/3; if (y == 0 && g[i].y == 1) g[i].x += b[6], b[6] = 0; else if (y == 0) { g[i].y--; g[m++] = topar(g[i].x + b[6], 1); b[6] = 0; } else if (y < g[i].y) { g[i].y -= y; g[m++] = topar(g[i].x + 3, y); b[6] -= 3*y; i--; } else g[i].x += 3, b[6] -= 3*g[i].y; } x = min(b[6]/3, n - t); if (x != 0) g[m++] = topar(3, x), b[6] -= 3*x, t += x; if (t < n && b[6] != 0) g[m++] = topar(b[6], 1), b[6] = 0, t++; if (b[6] > 0) return 0; return 1; } char o[4][10][100] = { {"", "M", "MM", "MMM", "?", "?", "?", "?", "?", "?"}, {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}, {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}, {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"} }; void print(ll x) { ll a[4]; a[0] = x/1000, x %= 1000; a[1] = x/100, x %= 100; a[2] = x/10, x %= 10; a[3] = x; printf("%s%s%s%s", o[0][a[0]], o[1][a[1]], o[2][a[2]], o[3][a[3]]); } int main() { ll n = 0, r, s, i, a[7]; rep(i, 7) n += a[i] = get_int(); r = 0, s = n; while (r < s) { ll m = (r + s)/2; if (foo(a, m)) s = m; else r = m + 1; } assert(foo(a, r)); printf("%lld\n", r); printf("%lld\n", m); rep(i, m) print(g[i].x), printf(" %lld\n", g[i].y); return 0; }