#include #include #include using namespace std; vector range {1000,500,100,50,10,5,1}; int toNum(char rouma) { switch(rouma) { case 'I': return 1; case 'V': return 5; case 'X': return 10; case 'L': return 50; case 'C': return 100; case 'D': return 500; case 'M': return 1000; } throw; } inline int toNum(string rouma) { int ret = 0; int last = 0; for(char c : rouma) { int curr = toNum(c); ret += curr; if (curr > last) { ret -= last*2; } last = curr; } return ret; } inline char getRouma(int num) { switch(num) { case 1 : return 'I'; case 5 : return 'V'; case 10 : return 'X'; case 50 : return 'L'; case 100 : return 'C'; case 500 : return 'D'; case 1000: return 'M'; } throw; } inline char getNext(int num) { switch(num) { case 1 : return 'V'; case 5 : return 'X'; case 10 : return 'L'; case 50 : return 'C'; case 100 : return 'D'; case 500 : return 'M'; } throw; } string toRouma(int num) { if (num > 3999) return "ERROR"; vector niseMap(1024); for(int i : range) { while(num >= i) { ++niseMap[i]; num -= i; } } string ret; for(int i : range) { int cnt = niseMap[i]; if (cnt != 0) { if (cnt == 4) { if (*ret.rbegin() == getNext(i)) { //ret = "V"; i = 1; cnt = 4; //VIV => IX ret.pop_back(); ret += getRouma(i); ret += getNext(toNum(getNext(i))); } else { //IIII => IV; ret += getRouma(i); ret += getNext(i); } } else { ret += string(cnt, getRouma(i)); } } } return ret; } int main() { int n; cin >> n; vector arr(n); int sum = 0; for(int i = 0; i < n; ++i) { cin >> arr[i]; int num = toNum(arr[i]); sum += num; //cout << num << endl; } //cout << sum << endl; cout << toRouma(sum) << endl; }