
_UpperCAmelCase      :				List[Any]          = range(2, 20 + 1)
_UpperCAmelCase      :				int          = [10**k for k in range(ks[-1] + 1)]
_UpperCAmelCase      :				int          = {}


def    A (      lowercase					, lowercase					, lowercase					, lowercase				)     ->						List[Any]:
		'''simple docstring'''

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

		UpperCamelCase						=  0, 0
		UpperCamelCase						=  n - i

		UpperCamelCase						=  memo.get(lowercase				)

		if sub_memo is not None:
				UpperCamelCase						=  sub_memo.get(lowercase				)

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

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

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

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

		if k > ks[0]:
				while True:
						# keep doing smaller jumps
						UpperCamelCase						=  next_term(lowercase					, k - 1					, i + dn					, lowercase				)
						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
				UpperCamelCase						=  compute(lowercase					, lowercase					, i + dn					, lowercase				)
				diff += _diff
				dn += terms_jumped

		UpperCamelCase						=  sub_memo[c]

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

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


def    A (      lowercase					, lowercase					, lowercase					, lowercase				)     ->						List[Any]:
		'''simple docstring'''

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

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

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

						ds_c += a_i[j]

				if addend > 0:
						break

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


def    A (      lowercase					, lowercase					, lowercase				)     ->						Tuple:
		'''simple docstring'''

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

				if addend == 0:
						break

		while addend > 0:
				UpperCamelCase						=  divmod(lowercase					, 10				)
				digits.append(lowercase				)


def    A (      lowercase = 10**15				)     ->						int:
		'''simple docstring'''

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

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


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


from abc import ABC, abstractmethod
from typing import List, Optional


class        lowercase      (	_SCREAMING_SNAKE_CASE     ):



		def __init__(				self )						->      Optional[Any]:
				"""simple docstring"""
				# test for the above condition
				self.test()



		def __UpperCamelCase				(				self )						->      Dict:
				"""simple docstring"""
				UpperCamelCase						=  0
				UpperCamelCase						=  False
				while not completed:
						if counter == 1:
								self.reset()
						UpperCamelCase						=  self.advance()
						if not self.does_advance(A_ ):
								raise Exception(
								    'Custom Constraint is not defined correctly. self.does_advance(self.advance()) must be true.' )

						UpperCamelCase			,						UpperCamelCase			,						UpperCamelCase						=  self.update(A_ )
						counter += 1

						if counter > 10_000:
								raise Exception('update() does not fulfill the constraint.' )

				if self.remaining() != 0:
						raise Exception('Custom Constraint is not defined correctly.' )



		@abstractmethod
		def __UpperCamelCase				(				self )						->      Optional[Any]:
				"""simple docstring"""
				raise NotImplementedError(
				    F'''{self.__class__} is an abstract class. Only classes inheriting this class can be called.''' )



		@abstractmethod
		def __UpperCamelCase				(				self       ,   A_ )						->      str:
				"""simple docstring"""
				raise NotImplementedError(
				    F'''{self.__class__} is an abstract class. Only classes inheriting this class can be called.''' )



		@abstractmethod
		def __UpperCamelCase				(				self       ,   A_ )						->      int:
				"""simple docstring"""
				raise NotImplementedError(
				    F'''{self.__class__} is an abstract class. Only classes inheriting this class can be called.''' )



		@abstractmethod
		def __UpperCamelCase				(				self )						->      Any:
				"""simple docstring"""
				raise NotImplementedError(
				    F'''{self.__class__} is an abstract class. Only classes inheriting this class can be called.''' )



		@abstractmethod
		def __UpperCamelCase				(				self )						->      str:
				"""simple docstring"""
				raise NotImplementedError(
				    F'''{self.__class__} is an abstract class. Only classes inheriting this class can be called.''' )



		@abstractmethod
		def __UpperCamelCase				(				self       ,   A_=False )						->      int:
				"""simple docstring"""
				raise NotImplementedError(
				    F'''{self.__class__} is an abstract class. Only classes inheriting this class can be called.''' )






class        lowercase      (	_SCREAMING_SNAKE_CASE     ):



		def __init__(				self       ,   A_ )						->      Any:
				"""simple docstring"""
				super(A_       ,   self ).__init__()

				if not isinstance(A_       ,   A_ ) or len(A_ ) == 0:
						raise ValueError(F'''`token_ids` has to be a non-empty list, but is {token_ids}.''' )
				if any((not isinstance(A_       ,   A_ ) or token_id < 0) for token_id in token_ids ):
						raise ValueError(F'''Each list in `token_ids` has to be a list of positive integers, but is {token_ids}.''' )

				UpperCamelCase						=  token_ids

				UpperCamelCase						=  len(self.token_ids )
				UpperCamelCase						=  -1  # the index of the currently fulfilled step
				UpperCamelCase						=  False



		def __UpperCamelCase				(				self )						->      Optional[Any]:
				"""simple docstring"""
				if self.completed:
						return None
				return self.token_ids[self.fulfilled_idx + 1]



		def __UpperCamelCase				(				self       ,   A_ )						->      Optional[int]:
				"""simple docstring"""
				if not isinstance(A_       ,   A_ ):
						raise ValueError(F'''`token_id` has to be an `int`, but is {token_id} of type {type(A_ )}''' )

				if self.completed:
						return False

				return token_id == self.token_ids[self.fulfilled_idx + 1]



		def __UpperCamelCase				(				self       ,   A_ )						->      Optional[int]:
				"""simple docstring"""
				if not isinstance(A_       ,   A_ ):
						raise ValueError(F'''`token_id` has to be an `int`, but is {token_id} of type {type(A_ )}''' )

				UpperCamelCase						=  False
				UpperCamelCase						=  False
				UpperCamelCase						=  False

				if self.does_advance(A_ ):
						self.fulfilled_idx += 1
						UpperCamelCase						=  True
						if self.fulfilled_idx == (self.seqlen - 1):
								UpperCamelCase						=  True
						UpperCamelCase						=  completed
				else:
						# failed to make progress.
						UpperCamelCase						=  True
						self.reset()
				return stepped, completed, reset



		def __UpperCamelCase				(				self )						->      Dict:
				"""simple docstring"""
				UpperCamelCase						=  False
				UpperCamelCase						=  0



		def __UpperCamelCase				(				self )						->      int:
				"""simple docstring"""
				return self.seqlen - (self.fulfilled_idx + 1)



		def __UpperCamelCase				(				self       ,   A_=False )						->      Union[str, Any]:
				"""simple docstring"""
				UpperCamelCase						=  PhrasalConstraint(self.token_ids )

				if stateful:
						UpperCamelCase						=  self.seqlen
						UpperCamelCase						=  self.fulfilled_idx
						UpperCamelCase						=  self.completed

				return new_constraint






class        lowercase      :



		def __init__(				self       ,   A_       ,   A_=True )						->      List[Any]:
				"""simple docstring"""
				UpperCamelCase						=  max([len(A_ ) for one in nested_token_ids] )

				UpperCamelCase						=  {}
				for token_ids in nested_token_ids:
						UpperCamelCase						=  root
						for tidx, token_id in enumerate(A_ ):
								if token_id not in level:
										UpperCamelCase						=  {}

								UpperCamelCase						=  level[token_id]

				if no_subsets and self.has_subsets(A_       ,   A_ ):
						raise ValueError(
						    'Each list in `nested_token_ids` can\'t be a complete subset of another list, but is'
						    F''' {nested_token_ids}.''' )

				UpperCamelCase						=  root



		def __UpperCamelCase				(				self       ,   A_ )						->      Optional[Any]:
				"""simple docstring"""
				UpperCamelCase						=  self.trie

				for current_token in current_seq:
						UpperCamelCase						=  start[current_token]

				UpperCamelCase						=  list(start.keys() )

				return next_tokens



		def __UpperCamelCase				(				self       ,   A_ )						->      Union[str, Any]:
				"""simple docstring"""
				UpperCamelCase						=  self.next_tokens(A_ )

				return len(A_ ) == 0



		def __UpperCamelCase				(				self       ,   A_ )						->      List[str]:
				"""simple docstring"""
				UpperCamelCase						=  list(root.values() )
				if len(A_ ) == 0:
						return 1
				else:
						return sum([self.count_leaves(A_ ) for nn in next_nodes] )



		def __UpperCamelCase				(				self       ,   A_       ,   A_ )						->      Optional[int]:
				"""simple docstring"""
				UpperCamelCase						=  self.count_leaves(A_ )
				return len(A_ ) != leaf_count






class        lowercase      (	_SCREAMING_SNAKE_CASE     ):



		def __init__(				self       ,   A_ )						->      str:
				"""simple docstring"""
				super(A_       ,   self ).__init__()

				if not isinstance(A_       ,   A_ ) or len(A_ ) == 0:
						raise ValueError(F'''`nested_token_ids` has to be a non-empty list, but is {nested_token_ids}.''' )
				if any(not isinstance(A_       ,   A_ ) for token_ids in nested_token_ids ):
						raise ValueError(F'''`nested_token_ids` has to be a list of lists, but is {nested_token_ids}.''' )
				if any(
				    any((not isinstance(A_       ,   A_ ) or token_id < 0) for token_id in token_ids )
				    for token_ids in nested_token_ids ):
						raise ValueError(
						    F'''Each list in `nested_token_ids` has to be a list of positive integers, but is {nested_token_ids}.''' )

				UpperCamelCase						=  DisjunctiveTrie(A_ )
				UpperCamelCase						=  nested_token_ids

				UpperCamelCase						=  self.trie.max_height
				UpperCamelCase						=  []
				UpperCamelCase						=  False



		def __UpperCamelCase				(				self )						->      Union[str, Any]:
				"""simple docstring"""
				UpperCamelCase						=  self.trie.next_tokens(self.current_seq )

				if len(A_ ) == 0:
						return None
				else:
						return token_list



		def __UpperCamelCase				(				self       ,   A_ )						->      Optional[Any]:
				"""simple docstring"""
				if not isinstance(A_       ,   A_ ):
						raise ValueError(F'''`token_id` is supposed to be type `int`, but is {token_id} of type {type(A_ )}''' )

				UpperCamelCase						=  self.trie.next_tokens(self.current_seq )

				return token_id in next_tokens



		def __UpperCamelCase				(				self       ,   A_ )						->      Optional[Any]:
				"""simple docstring"""
				if not isinstance(A_       ,   A_ ):
						raise ValueError(F'''`token_id` is supposed to be type `int`, but is {token_id} of type {type(A_ )}''' )

				UpperCamelCase						=  False
				UpperCamelCase						=  False
				UpperCamelCase						=  False

				if self.does_advance(A_ ):
						self.current_seq.append(A_ )
						UpperCamelCase						=  True
				else:
						UpperCamelCase						=  True
						self.reset()

				UpperCamelCase						=  self.trie.reached_leaf(self.current_seq )
				UpperCamelCase						=  completed

				return stepped, completed, reset



		def __UpperCamelCase				(				self )						->      str:
				"""simple docstring"""
				UpperCamelCase						=  False
				UpperCamelCase						=  []



		def __UpperCamelCase				(				self )						->      Optional[int]:
				"""simple docstring"""
				if self.completed:
						# since this can be completed without reaching max height
						return 0
				else:
						return self.seqlen - len(self.current_seq )



		def __UpperCamelCase				(				self       ,   A_=False )						->      int:
				"""simple docstring"""
				UpperCamelCase						=  DisjunctiveConstraint(self.token_ids )

				if stateful:
						UpperCamelCase						=  self.seqlen
						UpperCamelCase						=  self.current_seq
						UpperCamelCase						=  self.completed

				return new_constraint






class        lowercase      :



		def __init__(				self       ,   A_ )						->      Tuple:
				"""simple docstring"""
				UpperCamelCase						=  constraints

				# max # of steps required to fulfill a given constraint
				UpperCamelCase						=  max([c.seqlen for c in constraints] )
				UpperCamelCase						=  len(A_ )
				UpperCamelCase						=  False

				self.init_state()



		def __UpperCamelCase				(				self )						->      List[str]:
				"""simple docstring"""
				UpperCamelCase						=  []
				UpperCamelCase						=  None
				UpperCamelCase						=  [constraint.copy(stateful=A_ ) for constraint in self.constraints]



		def __UpperCamelCase				(				self )						->      Optional[int]:
				"""simple docstring"""
				UpperCamelCase						=  0
				if self.inprogress_constraint:
						# extra points for having a constraint mid-fulfilled
						add += self.max_seqlen - self.inprogress_constraint.remaining()

				return (len(self.complete_constraints ) * self.max_seqlen) + add



		def __UpperCamelCase				(				self )						->      Optional[int]:
				"""simple docstring"""
				UpperCamelCase						=  []
				if self.inprogress_constraint is None:
						for constraint in self.pending_constraints:  # "pending" == "unfulfilled yet"
								UpperCamelCase						=  constraint.advance()
								if isinstance(A_       ,   A_ ):
										token_list.append(A_ )
								elif isinstance(A_       ,   A_ ):
										token_list.extend(A_ )
				else:
						UpperCamelCase						=  self.inprogress_constraint.advance()
						if isinstance(A_       ,   A_ ):
								token_list.append(A_ )
						elif isinstance(A_       ,   A_ ):
								token_list.extend(A_ )

				if len(A_ ) == 0:
						return None
				else:
						return token_list



		def __UpperCamelCase				(				self       ,   A_ )						->      Any:
				"""simple docstring"""
				self.init_state()

				if token_ids is not None:
						for token in token_ids:
								# completes or steps **one** constraint
								UpperCamelCase			,						UpperCamelCase						=  self.add(A_ )

								# the entire list of constraints are fulfilled
								if self.completed:
										break



		def __UpperCamelCase				(				self       ,   A_ )						->      int:
				"""simple docstring"""
				if not isinstance(A_       ,   A_ ):
						raise ValueError(F'''`token_id` should be an `int`, but is `{token_id}`.''' )

				UpperCamelCase			,						UpperCamelCase						=  False, False

				if self.completed:
						UpperCamelCase						=  True
						UpperCamelCase						=  False
						return complete, stepped

				if self.inprogress_constraint is not None:
						# In the middle of fulfilling a constraint. If the `token_id` *does* makes an incremental progress to current
						# job, simply update the state

						UpperCamelCase			,						UpperCamelCase			,						UpperCamelCase						=  self.inprogress_constraint.update(A_ )
						if reset:
								# 1. If the next token breaks the progress, then we must restart.
								#     e.g. constraint = "I love pies" and sequence so far is "I love" but `token_id` == "books".

								#     But that doesn't mean we self.init_state(), since we only reset the state for this particular
								#     constraint, not the full list of constraints.

								self.pending_constraints.append(self.inprogress_constraint.copy(stateful=A_ ) )
								UpperCamelCase						=  None

						if complete:
								# 2. If the next token completes the constraint, move it to completed list, set
								#     inprogress to None. If there are no pending constraints either, then this full list of constraints
								#     is complete.

								self.complete_constraints.append(self.inprogress_constraint )
								UpperCamelCase						=  None

								if len(self.pending_constraints ) == 0:
										# we're done!
										UpperCamelCase						=  True

				else:
						# Not in the middle of fulfilling a constraint. So does this `token_id` helps us step towards any of our list
						# of constraints?

						for cidx, pending_constraint in enumerate(self.pending_constraints ):
								if pending_constraint.does_advance(A_ ):
										UpperCamelCase			,						UpperCamelCase			,						UpperCamelCase						=  pending_constraint.update(A_ )

										if not stepped:
												raise Exception(
												    '`constraint.update(token_id)` is not yielding incremental progress, '
												    'even though `constraint.does_advance(token_id)` is true.' )

										if complete:
												self.complete_constraints.append(A_ )
												UpperCamelCase						=  None

										if not complete and stepped:
												UpperCamelCase						=  pending_constraint

										if complete or stepped:
												# If we made any progress at all, then it's at least not a "pending constraint".

												UpperCamelCase						=  (
												    self.pending_constraints[:cidx] + self.pending_constraints[cidx + 1 :]
												)

												if len(self.pending_constraints ) == 0 and self.inprogress_constraint is None:
														# If there's no longer any pending after this and no inprogress either, then we must be
														# complete.

														UpperCamelCase						=  True

												break  # prevent accidentally stepping through multiple constraints with just one token.

				return complete, stepped



		def __UpperCamelCase				(				self       ,   A_=True )						->      Tuple:
				"""simple docstring"""
				UpperCamelCase						=  ConstraintListState(self.constraints )  # we actually never though self.constraints objects
				# throughout this process. So it's at initialization state.

				if stateful:
						UpperCamelCase						=  [
						    constraint.copy(stateful=A_ ) for constraint in self.complete_constraints
						]
						if self.inprogress_constraint is not None:
								UpperCamelCase						=  self.inprogress_constraint.copy(stateful=A_ )
						UpperCamelCase						=  [constraint.copy() for constraint in self.pending_constraints]

				return new_state
