



from __future__ import annotations

import typing
from collections.abc import Iterable

import numpy as np

lowercase_						=       typing.Union[Iterable[float], Iterable[int], np.ndarray]  # noqa: UP007
lowercase_						=       typing.Union[np.floataa, int, float]  # noqa: UP007



def __lowerCAmelCase	(       SCREAMING_SNAKE_CASE_  ,					SCREAMING_SNAKE_CASE_					):
			return np.sqrt(np.sum((np.asarray(SCREAMING_SNAKE_CASE_					) - np.asarray(SCREAMING_SNAKE_CASE_					)) ** 2					)					)



def __lowerCAmelCase	(       SCREAMING_SNAKE_CASE_  ,					SCREAMING_SNAKE_CASE_					):
			return sum((va - va) ** 2 for va, va in zip(SCREAMING_SNAKE_CASE_  ,					SCREAMING_SNAKE_CASE_					)					) ** (1 / 2)


if __name__ == "__main__":



							def __lowerCAmelCase	(       ):
										from timeit import timeit

										print("Without Numpy"					)
										print(
										    timeit(
										        "euclidean_distance_no_np([1, 2, 3], [4, 5, 6])"  ,					number=1_0000  ,					globals=globals()  ,					)					)
										print("With Numpy"					)
										print(
										    timeit(
										        "euclidean_distance([1, 2, 3], [4, 5, 6])"  ,					number=1_0000  ,					globals=globals()  ,					)					)




							benchmark()









def __lowerCAmelCase	(       SCREAMING_SNAKE_CASE_  ,					SCREAMING_SNAKE_CASE_					):
			lowercase__   					=			1  # To kept the Calculated Value
			# Since C(n, k) = C(n, n-k)
			if k > (n - k):
						lowercase__   					=			n - k
			# Calculate C(n,k)
			for i in range(SCREAMING_SNAKE_CASE_					):
						result *= n - i
						result //= i + 1
			return result



def __lowerCAmelCase	(       SCREAMING_SNAKE_CASE_					):
			return binomial_coefficient(2 * node_count  ,					SCREAMING_SNAKE_CASE_					) // (node_count + 1)



def __lowerCAmelCase	(       SCREAMING_SNAKE_CASE_					):
			if n < 0:
						raise ValueError("factorial() not defined for negative values"					)
			lowercase__   					=			1
			for i in range(1  ,					n + 1					):
						result *= i
			return result



def __lowerCAmelCase	(       SCREAMING_SNAKE_CASE_					):
			return catalan_number(SCREAMING_SNAKE_CASE_					) * factorial(SCREAMING_SNAKE_CASE_					)


if __name__ == "__main__":
							lowercase_						=       int(input("""Enter the number of nodes: """).strip() or 0)
							if node_count <= 0:
														raise ValueError("""We need some nodes to work with.""")
							print(
							    F'Given {node_count} nodes, there are {binary_tree_count(node_count)} '
							    F'binary trees and {catalan_number(node_count)} binary search trees.'
							)




