


'''simple docstring'''




from math import factorial

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





def   _a		(lowercase__			:   int						)			->			int:






     """simple docstring"""
     if not isinstance(lowercase__							,   lowercase__						):
          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(lowercase__						)						)





def   _a		(lowercase__			:   int = 6_0							,   lowercase__			:   int = 1_0_0_0_0_0_0						)			->			int:






     """simple docstring"""

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

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

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

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

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





from ...configuration_utils import PretrainedConfig
from ...utils import logging


a  :      List[Any]            =    logging.get_logger(__name__)

a  :      Union[str, Any]            =    {
    """bigcode/gpt_bigcode-santacoder""": """https://huggingface.co/bigcode/gpt_bigcode-santacoder/resolve/main/config.json""",
}

class 					_lowercase    (     UpperCAmelCase__			):






    '''simple docstring'''
    SCREAMING_SNAKE_CASE:				List[str]          =    'gpt_bigcode'
    SCREAMING_SNAKE_CASE:				Union[str, Any]          =    ['past_key_values']
    SCREAMING_SNAKE_CASE:				Tuple          =    {
        'hidden_size': 'n_embd',
        'max_position_embeddings': 'n_positions',
        'num_attention_heads': 'n_head',
        'num_hidden_layers': 'n_layer',
    }




    def __init__(    self       ,						lowerCamelCase__=50_257       ,						lowerCamelCase__=1_024       ,						lowerCamelCase__=768       ,						lowerCamelCase__=12       ,						lowerCamelCase__=12       ,						lowerCamelCase__=None       ,						lowerCamelCase__="gelu_pytorch_tanh"       ,						lowerCamelCase__=0.1       ,						lowerCamelCase__=0.1       ,						lowerCamelCase__=0.1       ,						lowerCamelCase__=1E-5       ,						lowerCamelCase__=0.0_2       ,						lowerCamelCase__=True       ,						lowerCamelCase__=True       ,						lowerCamelCase__=50_256       ,						lowerCamelCase__=50_256       ,						lowerCamelCase__=True       ,						lowerCamelCase__=True       ,						lowerCamelCase__=True       ,						**lowerCamelCase__       ,						):
       lowerCAmelCase_:							List[Any]       =	vocab_size
       lowerCAmelCase_:							List[str]       =	n_positions
       lowerCAmelCase_:							Union[str, Any]       =	n_embd
       lowerCAmelCase_:							Union[str, Any]       =	n_layer
       lowerCAmelCase_:							Union[str, Any]       =	n_head
       lowerCAmelCase_:							List[Any]       =	n_inner
       lowerCAmelCase_:							List[Any]       =	activation_function
       lowerCAmelCase_:							Optional[int]       =	resid_pdrop
       lowerCAmelCase_:							Union[str, Any]       =	embd_pdrop
       lowerCAmelCase_:							Any       =	attn_pdrop
       lowerCAmelCase_:							Union[str, Any]       =	layer_norm_epsilon
       lowerCAmelCase_:							Optional[Any]       =	initializer_range
       lowerCAmelCase_:							int       =	scale_attn_weights
       lowerCAmelCase_:							int       =	use_cache
       lowerCAmelCase_:							int       =	attention_softmax_in_fpaa
       lowerCAmelCase_:							int       =	scale_attention_softmax_in_fpaa
       lowerCAmelCase_:							Union[str, Any]       =	multi_query

       lowerCAmelCase_:							Union[str, Any]       =	bos_token_id
       lowerCAmelCase_:							List[str]       =	eos_token_id

       super().__init__(bos_token_id=lowerCamelCase__       ,						eos_token_id=lowerCamelCase__       ,						**lowerCamelCase__ )