"""simple docstring"""
def 						__a   (	_SCREAMING_SNAKE_CASE   )	->"list[int]":
  if upper_limit < 0:
    raise ValueError('Limit for the Catalan sequence must be ≥ 0'   )

  a__:     List[Any]										=	[0] * (upper_limit + 1)

  # Base case: C(0) = C(1) = 1
  a__:     Dict										=	1
  if upper_limit > 0:
    a__:     int										=	1

  # Recurrence relation: C(i) = sum(C(j).C(i-j-1)), from j = 0 to i
  for i in range(2		,     upper_limit + 1   ):
    for j in range(_SCREAMING_SNAKE_CASE   ):
      catalan_list[i] += catalan_list[j] * catalan_list[i - j - 1]

  return catalan_list


if __name__ == "__main__":
 print('\n********* Catalan Numbers Using Dynamic Programming ************\n')
 print('\n*** Enter -1 at any time to quit ***')
 print('\nEnter the upper limit (≥ 0) for the Catalan number sequence: ', end='')
 try:
  while True:
   lowercase__					       =	int(input().strip())
   if N < 0:
    print('\n********* Goodbye!! ************')
    break
   else:
    print(f"The Catalan numbers from 0 through {N} are:")
    print(catalan_numbers(N))
    print('Try another upper limit for the sequence: ', end='')
 except (NameError, ValueError):
  print('\n********* Invalid input, goodbye! ************\n')

 import doctest

 doctest.testmod()



"""simple docstring"""
def 						__a   (	_SCREAMING_SNAKE_CASE		,     _SCREAMING_SNAKE_CASE   )	->int:
  while a != 0:
    a__							,    a__:     List[str]										=	b % a, a
  return b







def 						__a   (	_SCREAMING_SNAKE_CASE		,     _SCREAMING_SNAKE_CASE   )	->int:
  if gcd(_SCREAMING_SNAKE_CASE		,     _SCREAMING_SNAKE_CASE   ) != 1:
    a__:     Dict										=	F'mod inverse of {a!r} and {m!r} does not exist'
    raise ValueError(_SCREAMING_SNAKE_CASE   )
  a__							,    a__							,    a__:     Union[str, Any]										=	1, 0, a
  a__							,    a__							,    a__:     Any										=	0, 1, m
  while va != 0:
    a__:     int										=	ua // va
    a__							,    a__							,    a__							,    a__							,    a__							,    a__:     Any										=	(ua - q * va), (ua - q * va), (ua - q * va), va, va, va
  return ua % m


