





def   lowerCamelCase__       (       UpperCamelCase__     :    int  )     ->	"list[int]":



					'''simple docstring'''




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

					_snake_case													=			[0] * (upper_limit + 1)

					# Base case: C(0) = C(1) = 1
					_snake_case													=			1
					if upper_limit > 0:
										_snake_case													=			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:
															UpperCAmelCase_ 							=       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()








import random





def   lowerCamelCase__       (       UpperCamelCase__     :    int    ,      UpperCamelCase__     :    float    ,      UpperCamelCase__     :    bool = False  )     ->	dict:



					'''simple docstring'''




					_snake_case													=			{i: [] for i in range(UpperCamelCase__  )}

					# if probability is greater or equal than 1, then generate a complete graph
					if probability >= 1:
										return complete_graph(UpperCamelCase__  )
					# if probability is lower or equal than 0, then return a graph without edges
					if probability <= 0:
										return graph

					# for each couple of nodes, add an edge from u to v
					# if the number randomly generated is greater than probability probability
					for i in range(UpperCamelCase__  ):
										for j in range(i + 1    ,      UpperCamelCase__  ):
															if random.random() < probability:
																				graph[i].append(UpperCamelCase__  )
																				if not directed:
																									# if the graph is undirected, add an edge in from j to i, either
																									graph[j].append(UpperCamelCase__  )
					return graph





def   lowerCamelCase__       (       UpperCamelCase__     :    int  )     ->	dict:



					'''simple docstring'''




					return {
					    i: [j for j in range(UpperCamelCase__  ) if i != j] for i in range(UpperCamelCase__  )
					}


if __name__ == "__main__":
					import doctest

					doctest.testmod()



