문제

링크

풀이

#include <iostream>
#include <string>
#include <unordered_set>
#include <utility>
using namespace std;
 
struct pair_hash {
  size_t operator()(const pair<int, int> &p) const {
    return (p.first << 16) + p.second;
  }
};
 
int n;
unordered_set<int> a;
unordered_set<pair<int, int>, pair_hash> b;
 
inline int calc(const string &s) {
  int ret = 0;
  for (char c : s) {
    if (c == 'I') ret += 1;
    else if (c == 'V') ret += 5;
    else if (c == 'X') ret += 10;
    else if (c == 'L') ret += 50;
  }
  return ret;
}
 
void backtrack(int idx, string cur) {
  if (idx == n) {
    a.insert(calc(cur));
    return;
  }
  b.insert({idx, calc(cur)});
 
  if (!b.count({idx+1, calc(cur+'I')})) backtrack(idx+1, cur+'I');
  if (!b.count({idx+1, calc(cur+'V')})) backtrack(idx+1, cur+'V');
  if (!b.count({idx+1, calc(cur+'X')})) backtrack(idx+1, cur+'X');
  if (!b.count({idx+1, calc(cur+'L')})) backtrack(idx+1, cur+'L');
}
 
void solve(void) {
  cin >> n;
 
  backtrack(0, "");
  cout << a.size();
}
 
int main(void) {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
 
  solve();
  return 0;
}