




__lowerCAmelCase		:				Any       			=		range(2, 20 + 1)
__lowerCAmelCase		:				str       			=		[10**k for k in range(ks[-1] + 1)]
__lowerCAmelCase		:				dict[int, dict[int, list[list[int]]]]       			=		{}




def 			__magic_name__				( A		:					Optional[int],  A		:					List[Any],  A		:					List[Any],  A		:					Tuple   ):






			'''simple docstring'''







			a    =			sum(a_i[j] for j in range(A,  len(A   )   )   )
			a    =			sum(a_i[j] * base[j] for j in range(min(len(A   ),  A   )   )   )

			a    ,		a    =			0, 0
			a    =			n - i

			a    =			memo.get(A   )

			if sub_memo is not None:
						a    =			sub_memo.get(A   )

						if jumps is not None and len(A   ) > 0:
									# find and make the largest jump without going over
									a    =			-1
									for _k in range(len(A   ) - 1,  -1,  -1   ):
												if jumps[_k][2] <= k and jumps[_k][1] <= max_dn:
															a    =			_k
															break

									if max_jump >= 0:
												a    ,		a    ,		a    =			jumps[max_jump]
												# since the difference between jumps is cached, add c
												a    =			diff + c
												for j in range(min(A,  len(A   )   )   ):
															a    ,		a    =			divmod(A,  10   )
												if new_c > 0:
															add(A,  A,  A   )

						else:
									a    =			[]
			else:
						a    =			{c: []}
						a    =			sub_memo

			if dn >= max_dn or c + diff >= base[k]:
						return diff, dn

			if k > ks[0]:
						while True:
									# keep doing smaller jumps
									a    ,		a    =			next_term(A,  k - 1,  i + dn,  A   )
									diff += _diff
									dn += terms_jumped

									if dn >= max_dn or c + diff >= base[k]:
												break
			else:
						# would be too small a jump, just compute sequential terms instead
						a    ,		a    =			compute(A,  A,  i + dn,  A   )
						diff += _diff
						dn += terms_jumped

			a    =			sub_memo[c]

			# keep jumps sorted by # of terms skipped
			a    =			0
			while j < len(A   ):
						if jumps[j][1] > dn:
									break
						j += 1

			# cache the jump for this value digitsum(b) and c
			sub_memo[c].insert(A,  (diff, dn, k)   )
			return (diff, dn)




def 			__magic_name__				( A		:					str,  A		:					Union[str, Any],  A		:					Optional[int],  A		:					List[str]   ):






			'''simple docstring'''







			if i >= n:
						return 0, i
			if k > len(A   ):
						a_i.extend([0 for _ in range(k - len(A   )   )]   )

			# note: a_i -> b * 10^k + c
			# ds_b -> digitsum(b)
			# ds_c -> digitsum(c)
			a    =			i
			a    ,		a    ,		a    =			0, 0, 0
			for j in range(len(A   )   ):
						if j >= k:
									ds_b += a_i[j]
						else:
									ds_c += a_i[j]

			while i < n:
						i += 1
						a    =			ds_c + ds_b
						diff += addend
						a    =			0
						for j in range(A   ):
									a    =			a_i[j] + addend
									a    ,		a    =			divmod(A,  10   )

									ds_c += a_i[j]

						if addend > 0:
									break

			if addend > 0:
						add(A,  A,  A   )
			return diff, i - start_i




def 			__magic_name__				( A		:					int,  A		:					Any,  A		:					Optional[Any]   ):






			'''simple docstring'''







			for j in range(A,  len(A   )   ):
						a    =			digits[j] + addend
						if s >= 10:
									a    ,		a    =			divmod(A,  10   )
									a    =			addend // 10 + quotient
						else:
									a    =			s
									a    =			addend // 10

						if addend == 0:
									break

			while addend > 0:
						a    ,		a    =			divmod(A,  10   )
						digits.append(A   )




def 			__magic_name__				( A		:					int = 10**15   ):






			'''simple docstring'''







			a    =			[1]
			a    =			1
			a    =			0
			while True:
						a    ,		a    =			next_term(A,  20,  i + dn,  A   )
						dn += terms_jumped
						if dn == n - i:
									break

			a    =			0
			for j in range(len(A   )   ):
						a_n += digits[j] * 10**j
			return a_n


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












import unittest

from transformers import GPTSwaTokenizer
from transformers.testing_utils import get_tests_dir, require_sentencepiece, require_tokenizers, slow

from ...test_tokenization_common import TokenizerTesterMixin


__lowerCAmelCase		:				List[Any]       			=		get_tests_dir('fixtures/test_sentencepiece_with_bytefallback.model')




@require_sentencepiece
@require_tokenizers
class     snake_case__							(_UpperCamelCase    ,       unittest.TestCase   ):
				"""simple docstring"""



				SCREAMING_SNAKE_CASE_       :							Any							 =					GPTSwaTokenizer
				SCREAMING_SNAKE_CASE_       :							int							 =					False
				SCREAMING_SNAKE_CASE_       :							Union[str, Any]							 =					True
				SCREAMING_SNAKE_CASE_       :							Any							 =					False





				def 							__UpperCAmelCase							(      self				:     Tuple							)					->     Any:
							super().setUp()

							# We have a SentencePiece fixture for testing
							a    =			GPTSwaTokenizer(__lowerCamelCase					,      eos_token="<unk>"					,      bos_token="<unk>"					,      pad_token="<unk>"							)

							tokenizer.save_pretrained(self.tmpdirname							)





				def 							__UpperCAmelCase							(      self				:     Union[str, Any]					,      __lowerCamelCase				:     Optional[Any]							)					->     Any:
							a    =			"This is a test"
							a    =			"This is a test"
							return input_text, output_text





				def 							__UpperCAmelCase							(      self				:     List[Any]							)					->     List[str]:
							a    =			"<s>"
							a    =			1

							self.assertEqual(self.get_tokenizer()._convert_token_to_id(__lowerCamelCase							)					,      __lowerCamelCase							)
							self.assertEqual(self.get_tokenizer()._convert_id_to_token(__lowerCamelCase							)					,      __lowerCamelCase							)





				def 							__UpperCAmelCase							(      self				:     List[Any]							)					->     int:
							a    =			list(self.get_tokenizer().get_vocab().keys()							)

							self.assertEqual(vocab_keys[0]					,      "<unk>"							)
							self.assertEqual(vocab_keys[1]					,      "<s>"							)
							self.assertEqual(vocab_keys[-1]					,      "j"							)
							self.assertEqual(len(__lowerCamelCase							)					,      20_00							)





				def 							__UpperCAmelCase							(      self				:     Optional[int]							)					->     Dict:
							self.assertEqual(self.get_tokenizer().vocab_size					,      20_00							)





				def 							__UpperCAmelCase							(      self				:     Optional[int]							)					->     Union[str, Any]:
							a    =			GPTSwaTokenizer(__lowerCamelCase							)

							a    =			tokenizer.tokenize("This is a test"							)
							self.assertListEqual(__lowerCamelCase					,      ["▁This", "▁is", "▁a", "▁t", "est"]							)

							self.assertListEqual(tokenizer.convert_tokens_to_ids(__lowerCamelCase							)					,      [4_65, 2_87, 2_65, 6_31, 8_42]							)

							a    =			tokenizer.tokenize("I was born in 92000, and this is falsé."							)
							# fmt: off
							self.assertListEqual(
							    __lowerCamelCase					,      ["▁I", "▁was", "▁bor", "n", "▁in", "▁", "<0x39>", "2", "0", "0", "0", ",", "▁and", "▁this", "▁is", "▁f", "al", "s", "<0xC3>", "<0xA9>", "."]					,      )
							# fmt: on

							a    =			tokenizer.convert_tokens_to_ids(__lowerCamelCase							)
							self.assertListEqual(
							    __lowerCamelCase					,      [2_62, 2_72, 15_25, 2_86, 2_71, 2_68, 60, 9_16, 6_33, 6_33, 6_33, 2_59, 2_66, 3_01, 2_87, 3_84, 3_67, 2_63, 1_98, 1_72, 2_60]					,      )

							a    =			tokenizer.convert_ids_to_tokens(__lowerCamelCase							)
							# fmt: off
							self.assertListEqual(
							    __lowerCamelCase					,      ["▁I", "▁was", "▁bor", "n", "▁in", "▁", "<0x39>", "2", "0", "0", "0", ",", "▁and", "▁this", "▁is", "▁f", "al", "s", "<0xC3>", "<0xA9>", "."]							)
							# fmt: on





				def 							__UpperCAmelCase							(      self				:     List[Any]							)					->     str:
							a    =			GPTSwaTokenizer(__lowerCamelCase							)
							a    =			["This is a test", "I was born in 92000, and this is falsé."]
							a    =			[
							    [4_65, 2_87, 2_65, 6_31, 8_42],
							    [2_62, 2_72, 15_25, 2_86, 2_71, 2_68, 60, 9_16, 6_33, 6_33, 6_33, 2_59, 2_66, 3_01, 2_87, 3_84, 3_67, 2_63, 1_98, 1_72, 2_60],
							]

							# Test that encode_fast returns the same as tokenize + convert_tokens_to_ids
							for text, expected_ids in zip(__lowerCamelCase					,      __lowerCamelCase							):
										self.assertListEqual(tokenizer.encode_fast(__lowerCamelCase							)					,      __lowerCamelCase							)

							# Test that decode_fast returns the input text
							for text, token_ids in zip(__lowerCamelCase					,      __lowerCamelCase							):
										self.assertEqual(tokenizer.decode_fast(__lowerCamelCase							)					,      __lowerCamelCase							)





				@slow
				def 							__UpperCAmelCase							(      self				:     Optional[int]							)					->     List[Any]:
							a    =			[
							    "<|python|>def fibonacci(n)\n    if n < 0:\n        print('Incorrect input')",
							    "Hey there, how are you doing this fine day?",
							    "This is a text with a trailing spaces followed by a dot     .",
							    "Häj sväjs lillebrör! =)",
							    "Det är inget fel på Mr. Cool",
							]

							# fmt: off
							a    =			{"input_ids": [[6_34_23, 5, 68_11, 1_49_54, 2_82, 8_16, 38_21, 6_34_66, 6_34_25, 6_34_62, 18, 6_39_78, 6_78, 3_01, 13_20, 6_34_23, 6_34_55, 6_34_58, 18, 6_39_82, 42_46, 39_40, 19_01, 4_77_89, 55_47, 1_89_94], [1_96_30, 11_00, 6_34_46, 13_42, 6_33, 5_44, 44_88, 5_93, 51_02, 24_16, 6_34_95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [16_52, 4_28, 2_68, 19_36, 5_15, 2_68, 5_85_93, 2_24_13, 91_06, 5_46, 2_68, 3_32_13, 6_39_79, 6_98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5_51_30, 6_34_50, 9_24, 6_34_49, 22_49, 40_62, 15_58, 3_18, 6_35_04, 2_14_98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [5_09, 3_77, 28_27, 25_59, 3_32, 65_75, 6_34_43, 2_68_01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], "token_type_ids": [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], "attention_mask": [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]}
							# fmt: on
							self.tokenizer_integration_test_util(
							    expected_encoding=__lowerCamelCase					,      model_name="AI-Sweden/gpt-sw3-126m"					,      sequences=__lowerCamelCase					,      )






