





'''simple docstring'''



from math import factorial

_SCREAMING_SNAKE_CASE					=    {str(digit): factorial(digit) for digit in range(1_0)}




def    _lowerCAmelCase						(				lowerCamelCase_			:  int				):
			if not isinstance(lowerCamelCase_		,       lowerCamelCase_				):
						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(lowerCamelCase_				)				)




def    _lowerCAmelCase						(				lowerCamelCase_			:  int = 6_0		,       lowerCamelCase_			:  int = 1_0_0_0_0_0_0				):

			if not isinstance(lowerCamelCase_		,       lowerCamelCase_				) or not isinstance(lowerCamelCase_		,       lowerCamelCase_				):
						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
			__lowercase										=							0
			# the cached sizes of the previous chains
			__lowercase										=							{}

			for start_chain_element in range(1		,       lowerCamelCase_				):
						# The temporary set will contain the elements of the chain
						__lowercase										=							set()
						__lowercase										=							0

						# Stop computing the chain when you find a cached size, a repeating item or the
						# length is greater then the desired one.
						__lowercase										=							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(lowerCamelCase_				)
									chain_set_length += 1
									__lowercase										=							digit_factorial_sum(lowerCamelCase_				)

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

						__lowercase										=							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()}''')












'''simple docstring'''



import math




def    _lowerCAmelCase						(				lowerCamelCase_			:  int				):
			assert isinstance(lowerCamelCase_		,       lowerCamelCase_				) and (
			    number >= 0
			), "'number' must been an int and positive"

			if 1 < number < 4:
						# 2 and 3 are primes
						return True
			elif number < 2 or not number % 2:
						# Negatives, 0, 1 and all even numbers are not primes
						return False

			__lowercase										=							range(3		,       int(math.sqrt(lowerCamelCase_				) + 1				)		,       2				)
			return not any(not number % i for i in odd_numbers				)




def    _lowerCAmelCase						(				lowerCamelCase_			:  Dict		,       lowerCamelCase_			:  Any=1		,       **lowerCamelCase_			:  Tuple				):
			__lowercase										=							factor * value
			__lowercase										=							value

			while not is_prime(lowerCamelCase_				):
						value += 1 if not ("desc" in kwargs and kwargs["desc"] is True) else -1

			if value == first_value_val:
						return next_prime(value + 1		,       **lowerCamelCase_				)
			return value





