



'''simple docstring'''





from math import factorial

_lowerCAmelCase      						=	{str(digit): factorial(digit) for digit in range(10)}
def    _SCREAMING_SNAKE_CASE  (       UpperCamelCase			):



    """simple docstring"""





    if not isinstance(UpperCamelCase							,    UpperCamelCase			):
        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(UpperCamelCase			)			)
def    _SCREAMING_SNAKE_CASE  (       UpperCamelCase = 60							,    UpperCamelCase = 1000000			):



    """simple docstring"""





    if not isinstance(UpperCamelCase							,    UpperCamelCase			) or not isinstance(UpperCamelCase							,    UpperCamelCase			):
        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__ :  List[str]							      =					0
    # the cached sizes of the previous chains
    lowerCAmelCase__ :  dict[int, int]							      =					{}

    for start_chain_element in range(1							,    UpperCamelCase			):
        # 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__ :  Any							      =					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(UpperCamelCase			)
            chain_set_length += 1
            lowerCAmelCase__ :  List[Any]							      =					digit_factorial_sum(UpperCamelCase			)

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

        lowerCAmelCase__ :  Optional[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()}""")







'''simple docstring'''





from maths.prime_factors import prime_factors
def    _SCREAMING_SNAKE_CASE  (       UpperCamelCase			):



    """simple docstring"""





    if not isinstance(UpperCamelCase							,    UpperCamelCase			):
        lowerCAmelCase__ :  int							      =					f"""Input value of [number={number}] must be an integer"""
        raise TypeError(UpperCamelCase			)
    if number < 1:
        raise ValueError("""Input must be a positive integer"""			)
    return -1 if len(prime_factors(UpperCamelCase			)			) % 2 else 1


if __name__ == "__main__":
 import doctest

 doctest.testmod()


