



"""simple docstring"""






def     _lowercase       (						__snake_case			)		->     "list[int]":
			if upper_limit < 0:
						raise ValueError("Limit for the Catalan sequence must be ≥ 0"			)

			__lowerCAmelCase   :						int				= [0] * (upper_limit + 1)

			# Base case: C(0) = C(1) = 1
			__lowerCAmelCase   :						int				= 1
			if upper_limit > 0:
						__lowerCAmelCase   :						Optional[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(__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:
			__snake_case							:     int   =					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     _lowercase       (						__snake_case = 3      ,__snake_case = 7      ,__snake_case = 1_000_000			)		->     int:
			__lowerCAmelCase   :						Optional[Any]				= 0
			__lowerCAmelCase   :						List[str]				= 1

			for current_denominator in range(1      ,limit + 1			):
						__lowerCAmelCase   :						Optional[int]				= current_denominator * numerator // denominator
						if current_denominator % denominator == 0:
									current_numerator -= 1
						if current_numerator * max_denominator > current_denominator * max_numerator:
									__lowerCAmelCase   :						Union[str, Any]				= current_numerator
									__lowerCAmelCase   :						int				= current_denominator
			return max_numerator


if __name__ == "__main__":
	print(solution(numerator=3, denominator=7, limit=1_000_000))