// yukicoder: No.518 ローマ数字の和 // 2019.5.4 bal4u #include #if 1 #define gc() getchar_unlocked() #define pc(c) putchar_unlocked(c) #else #define gc() getchar() #define pc(c) putchar(c) #endif int in() // 非負整数の入力 { int n = 0, c = gc(); // while (isspace(c)) c = gc(); do n = 10 * n + (c & 0xf), c = gc(); while (c >= '0'); return n; } void ins(char *s) // 文字列の入力 スペース以下の文字で入力終了 { do *s = gc(); while (*s++ > ' '); *(s-1) = 0; } void outs(char *s) { while (*s) pc(*s++); } int d1[128], d2[128][128]; char R[15]; char *e[4][10] = { {0, "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}, {0, "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}, {0, "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}, {0, "M", "MM", "MMM"}}; int main() { int i, k, N, s, r; char *p; d1['I'] = 1, d1['V'] = 5, d1['X'] = 10; d1['L'] = 50, d1['C'] = 100, d1['D'] = 500, d1['M'] = 1000; d2['I']['V'] = 4, d2['I']['X'] = 9, d2['X']['L'] = 40; d2['X']['C'] = 90, d2['C']['D'] = 400, d2['C']['M'] = 900; s = 0, N = in(); while (N--) { ins(p = R); r = 0; while (*p) { if (d2[*p][*(p+1)] > 0) r += d2[*p][*(p+1)], p+=2; else r += d1[*p++]; } s += r; } if (s >3999) { outs("ERROR\n"); return 0; } i = 3, k = 1000; while (s) { if (s / k > 0) outs(e[i][s/k]); s %= k, i--, k /= 10; } pc('\n'); return 0; }