"""simple docstring"""



__magic_name__     					=       [
    (1_000, "M"),
    (900, "CM"),
    (500, "D"),
    (400, "CD"),
    (100, "C"),
    (90, "XC"),
    (50, "L"),
    (40, "XL"),
    (10, "X"),
    (9, "IX"),
    (5, "V"),
    (4, "IV"),
    (1, "I"),
]





def 	_lowerCamelCase			(			UpperCAmelCase__       )				->  int:


   '''simple docstring'''


   a__  					=		{"""I""": 1, """V""": 5, """X""": 10, """L""": 50, """C""": 1_00, """D""": 5_00, """M""": 10_00}
   a__  					=		0
   a__  					=		0
   while place < len(A__       ):
      if (place + 1 < len(A__       )) and (vals[roman[place]] < vals[roman[place + 1]]):
         total += vals[roman[place + 1]] - vals[roman[place]]
         place += 2
      else:
         total += vals[roman[place]]
         place += 1
   return total





def 	_lowerCamelCase			(			UpperCAmelCase__       )				->  Tuple:


   '''simple docstring'''


   a__  					=		[]
   for arabic, roman in ROMAN:
      (a__)  					=		divmod(A__,A__       )
      result.append(roman * factor       )
      if number == 0:
         break
   return "".join(A__       )


if __name__ == "__main__":
     import doctest

     doctest.testmod()






'''simple docstring'''






from math import factorial

__A   :    dict[str, int]											= {str(digit): factorial(digit) for digit in range(10)}







def 							UpperCamelCase_     (       A__   :  int   ):
  '''simple docstring'''





  if not isinstance(A__				,       A__   ):
    raise TypeError("""Parameter number must be int"""   )

  if number < 0:
    raise ValueError("""Parameter number must be greater than or equal to 0"""   )

  # Converts number in string to iterate on its digits and adds its factorial.
  return sum(DIGIT_FACTORIAL[digit] for digit in str(A__   )   )







def 							UpperCamelCase_     (       A__   :  int = 60				,       A__   :  int = 1_00_00_00   ):
  '''simple docstring'''





  if not isinstance(A__				,       A__   ) or not isinstance(A__				,       A__   ):
    raise TypeError("""Parameters chain_length and number_limit must be int"""   )

  if chain_length <= 0 or number_limit <= 0:
    raise ValueError(
        """Parameters chain_length and number_limit must be greater than 0"""   )

  # the counter for the chains with the exact desired length
  lowerCAmelCase_     : Optional[int]     =  0
  # the cached sizes of the previous chains
  lowerCAmelCase_     : dict[int, int]     =  {}

  for start_chain_element in range(1				,       A__   ):
    # The temporary set will contain the elements of the chain
    lowerCAmelCase_     : List[str]     =  set()
    lowerCAmelCase_     : Optional[int]     =  0

    # Stop computing the chain when you find a cached size, a repeating item or the
    # length is greater then the desired one.
    lowerCAmelCase_     : int     =  start_chain_element
    while (
        chain_element not in chain_sets_lengths
        and chain_element not in chain_set
        and chain_set_length <= chain_length
    ):
      chain_set.add(A__   )
      chain_set_length += 1
      lowerCAmelCase_     : Union[str, Any]     =  digit_factorial_sum(A__   )

    if chain_element in chain_sets_lengths:
      chain_set_length += chain_sets_lengths[chain_element]

    lowerCAmelCase_     : int     =  chain_set_length

    # If chain contains the exact amount of elements increase the counter
    if chain_set_length == chain_length:
      chains_counter += 1

  return chains_counter


if __name__ == "__main__":
  import doctest

  doctest.testmod()
  print(F'''{solution()}''')



