'''simple docstring'''


def  _lowerCamelCase   (				lowerCamelCase_ :							Tuple       ):



     """simple docstring"""





     if upper_limit < 0:
          raise ValueError('Limit for the Catalan sequence must be ≥ 0'       )

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

     # Base case: C(0) = C(1) = 1
     UpperCAmelCase_							:       str       =				1
     if upper_limit > 0:
          UpperCAmelCase_							:       Union[str, Any]       =				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(_UpperCAmelCase       ):
               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:
   snake_case__					:      List[Any]				      =  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'''


snake_case__					:      str				      =  '''Tobias Carryer'''

from time import time






class 					__SCREAMING_SNAKE_CASE						:







  '''simple docstring'''






  def __init__(			self				,		snake_case_				,		snake_case_				,		snake_case_				,		snake_case_=int(time()						)						):  # noqa: B008




       '''simple docstring'''

       UpperCAmelCase_							:       str       =				multiplier
       UpperCAmelCase_							:       Dict       =				increment
       UpperCAmelCase_							:       Tuple       =				modulo
       UpperCAmelCase_							:       Dict       =				seed






  def _UpperCamelCase					(			self						):




       '''simple docstring'''

       UpperCAmelCase_							:       Union[str, Any]       =				(self.multiplier * self.seed + self.increment) % self.modulo
       return self.seed


if __name__ == "__main__":
 # Show the LCG in action.
 snake_case__					:      Any				      =  LinearCongruentialGenerator(166_4525, 10_1390_4223, 2 << 31)
 while True:
  print(lcg.next_number())






