





'''simple docstring'''







snake_case_  :							List[str]            =	{
    "0": 1,
    "1": 1,
    "2": 2,
    "3": 6,
    "4": 24,
    "5": 1_20,
    "6": 7_20,
    "7": 50_40,
    "8": 4_03_20,
    "9": 36_28_80,
}

snake_case_  :							List[str]            =	{1_45: 1_45}

snake_case_  :							Optional[Any]            =	{
    1_45: 0,
    1_69: 3,
    3_63_01: 3,
    14_54: 3,
    8_71: 2,
    4_53_61: 2,
    8_72: 2,
}





def 							lowerCamelCase_   (	SCREAMING_SNAKE_CASE__   :      Any )			->						int:






						if n in CACHE_SUM_DIGIT_FACTORIALS:
												return CACHE_SUM_DIGIT_FACTORIALS[n]
						UpperCAmelCase_      :   Optional[int]      =	sum(DIGIT_FACTORIALS[let] for let in str(__UpperCAmelCase ) )
						UpperCAmelCase_      :   List[str]      =	ret
						return ret





def 							lowerCamelCase_   (	SCREAMING_SNAKE_CASE__   :      Tuple,      SCREAMING_SNAKE_CASE__   :      List[str] = None )			->						int:
						UpperCAmelCase_      :   Any      =	previous or set()
						if n in CHAIN_LENGTH_CACHE:
												return CHAIN_LENGTH_CACHE[n]
						UpperCAmelCase_      :   List[Any]      =	sum_digit_factorials(__UpperCAmelCase )
						if next_number in previous:
												UpperCAmelCase_      :   List[str]      =	0
												return 0
						else:
												previous.add(__UpperCAmelCase )
												UpperCAmelCase_      :   Optional[int]      =	1 + chain_length(__UpperCAmelCase,      __UpperCAmelCase )
												UpperCAmelCase_      :   List[str]      =	ret
												return ret





def 							lowerCamelCase_   (	SCREAMING_SNAKE_CASE__   :      Union[str, Any] = 60,      SCREAMING_SNAKE_CASE__   :      List[Any] = 1000000 )			->						int:
						return sum(1 for i in range(1,      __UpperCAmelCase ) if chain_length(__UpperCAmelCase ) == num_terms )


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










import os
import tempfile
import unittest
from typing import List

from transformers.models.esm.tokenization_esm import VOCAB_FILES_NAMES, EsmTokenizer
from transformers.testing_utils import require_tokenizers
from transformers.tokenization_utils import PreTrainedTokenizer
from transformers.tokenization_utils_base import PreTrainedTokenizerBase







@require_tokenizers
class 				a_    (						unittest.TestCase							):
						UpperCamelCase__ :		Any										=EsmTokenizer

						def       __a			(       self      :Optional[int])						->   Optional[int]:
												super().setUp()
												UpperCAmelCase_					=	tempfile.mkdtemp()
												# fmt: off
												UpperCAmelCase_					=	["<cls>", "<pad>", "<eos>", "<unk>", "L", "A", "G", "V", "S", "E", "R", "T", "I", "D", "P", "K", "Q", "N", "F", "Y", "M", "H", "W", "C", "X", "B", "U", "Z", "O", ".", "-", "<null_1>", "<mask>"]  # noqa: E501
												# fmt: on
												UpperCAmelCase_					=	os.path.join(self.tmpdirname  ,		VOCAB_FILES_NAMES['''vocab_file'''])
												with open(self.vocab_file  ,		'''w'''  ,		encoding='''utf-8''') as vocab_writer:
																		vocab_writer.write(''''''.join([x + '''\n''' for x in vocab_tokens]))

						def       __a			(       self      :List[str]  ,		**_lowercase      :Union[str, Any])						->   List[PreTrainedTokenizerBase]:
												return [self.get_tokenizer(**_lowercase)]

						def       __a			(       self      :Optional[int]  ,		**_lowercase      :List[str])						->   PreTrainedTokenizer:
												return self.tokenizer_class.from_pretrained(self.tmpdirname  ,		**_lowercase)

						def       __a			(       self      :int)						->   Any:
												UpperCAmelCase_					=	self.tokenizer_class(self.vocab_file)

												UpperCAmelCase_					=	tokenizer.tokenize('''LAGVS''')
												self.assertListEqual(_lowercase  ,		['''L''', '''A''', '''G''', '''V''', '''S'''])
												self.assertListEqual(tokenizer.convert_tokens_to_ids(_lowercase)  ,		[4, 5, 6, 7, 8])

						def       __a			(       self      :List[Any])						->   Optional[int]:
												UpperCAmelCase_					=	self.tokenizer_class(self.vocab_file)

												UpperCAmelCase_					=	'''LAGVS'''
												self.assertListEqual(tokenizer.encode(_lowercase)  ,		[0, 4, 5, 6, 7, 8, 2])

						def       __a			(       self      :Tuple)						->   Union[str, Any]:
												UpperCAmelCase_					=	self.tokenizer_class(self.vocab_file)

												UpperCAmelCase_					=	['''LAGVS''', '''WCB''']
												UpperCAmelCase_					=	tokenizer(_lowercase  ,		padding=_lowercase)['''input_ids''']

												self.assertListEqual(_lowercase  ,		[[0, 4, 5, 6, 7, 8, 2], [0, 22, 23, 25, 2]])

						def       __a			(       self      :str)						->   Any:
												UpperCAmelCase_					=	self.tokenizer_class(self.vocab_file)

												UpperCAmelCase_					=	['''LAGVS''', '''WCB''']
												UpperCAmelCase_					=	tokenizer(_lowercase  ,		padding=_lowercase)['''input_ids''']

												self.assertListEqual(_lowercase  ,		[[0, 4, 5, 6, 7, 8, 2], [0, 22, 23, 25, 2, 1, 1]])




						def       __a			(       self      :Dict)						->   Optional[int]:
												UpperCAmelCase_					=	self.get_tokenizers(fast=_lowercase)
												for tokenizer in tokenizers:
																		with self.subTest(f"{tokenizer.__class__.__name__}"):
																								UpperCAmelCase_					=	'''<unk>'''
																								UpperCAmelCase_					=	'''<mask>'''

																								UpperCAmelCase_					=	tokenizer.tokenize(_lowercase)
																								UpperCAmelCase_					=	tokenizer.tokenize(_lowercase)

																								self.assertEqual(len(_lowercase)  ,		1)
																								self.assertEqual(len(_lowercase)  ,		1)
																								self.assertEqual(token_a[0]  ,		_lowercase)
																								self.assertEqual(token_a[0]  ,		_lowercase)





