#JavaScript (ES7), 133 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+/^1*5?4{0,3}3?2{0,3}6?0{0,3}$/.test((--k+m).toString(7).replace(/0[62]|2[34]|4[51]/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: M 5: D
2: X 6: V
3: L
We replace all valid subtractive pairs of the form AB
with B
:
s.replace(/0[62]|2[34]|4[51]/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 failIC
is left unchanged, which also leaves an invalidI
in place
We check that the remaining symbols are in the correct order and do not appear more times than they're allowed to:
/^1*5?4{0,3}3?2{0,3}6?0{0,3}$/.test(...) // in the code
/^M*D?C{0,3}L?X{0,3}V?I{0,3}$/.test(...) // with Roman symbols