



"""simple docstring"""






from math import factorial

_lowercase				:				dict[str, int]   		=		{str(digit): factorial(digit) for digit in range(1_0)}






def   snake_case__     (	__lowerCamelCase       :					int			):
			"""simple docstring"""
			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   snake_case__     (	__lowerCamelCase       :					int = 60							,	__lowerCamelCase       :					int = 1000000			):
			"""simple docstring"""

			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
			lowerCamelCase__	:	Tuple				=0
			# the cached sizes of the previous chains
			lowerCamelCase__	:	dict[int, int]				={}

			for start_chain_element in range(1							,	__lowerCamelCase			):
						# The temporary set will contain the elements of the chain
						lowerCamelCase__	:	int				=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__	:	Optional[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(__lowerCamelCase			)
									chain_set_length += 1
									lowerCamelCase__	:	Tuple				=digit_factorial_sum(__lowerCamelCase			)

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

						lowerCamelCase__	:	List[str]				=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"""






def   snake_case__     (	__lowerCamelCase       :					int = 4000000			):
			"""simple docstring"""
			lowerCamelCase__	:	Dict				=[]
			lowerCamelCase__			,     lowerCamelCase__	:	Union[str, Any]				=0, 1
			while b <= n:
						if b % 2 == 0:
									even_fibs.append(__lowerCamelCase			)
						lowerCamelCase__			,     lowerCamelCase__	:	Union[str, Any]				=b, a + b
			return sum(__lowerCamelCase			)


if __name__ == "__main__":
		print(f'{solution() = }')




