#JavaScript (ES7), 134 bytes
Edit: Fixed to match the results returned by Jonathan Allan's code, which was given as a reference implementation by the OP.
n=>[...Array(m=k=7**n)].reduce(s=>s+/^.6*5?4{0,3}3?2{0,3}1?0{0,3}$/.test((--k+m).toString(7).replace(/0[12]|2[34]|4[56]/g,s=>s[1])),0)
###How?
We generate all numbers of \$N\$ digits in base 7 with an extra leading \$1\$ and interpret each digit as a Roman numeral symbol according to the following table:
0: I 4: C
1: V 5: D
2: X 6: M
3: L
We replace all valid subtractive pairs of the form AB
with B
:
s.replace(/0[12]|2[34]|4[56]/g, s => s[1])) // in the code
s.replace(/I[VX]|X[LC]|C[DM]/g, s => s[1])) // with Roman symbols
Examples:
XLIXIV
becomesLXV
XIIV
becomesXIV
, leaving aI
that will make the next test fail
We check that the remaining symbols are in the correct order and do not appear more times than they're allowed to:
/^.6*5?4{0,3}3?2{0,3}1?0{0,3}$/.test(...) // in the code
/^.M*D?C{0,3}L?X{0,3}V?I{0,3}$/.test(...) // with Roman symbols