"""simple docstring"""



from __future__ import annotations
class 						__UpperCAmelCase    :







			'''simple docstring'''





			def __init__(			self   ,      snake_case_ = 0							):







										'''simple docstring'''


										A__       :     Union[str, Any]								=			key





			def 		lowerCamelCase					(			self   ,      snake_case_   ,      snake_case_							):







										'''simple docstring'''


										assert isinstance(snake_case_   ,      snake_case_							) and isinstance(snake_case_   ,      snake_case_							)

										A__       :     Union[str, Any]								=			key or self.__key or 1

										# make sure key is an appropriate size
										key %= 255

										return [chr(ord(snake_case_							) ^ key							) for ch in content]





			def 		lowerCamelCase					(			self   ,      snake_case_   ,      snake_case_							):







										'''simple docstring'''


										assert isinstance(snake_case_   ,      snake_case_							) and isinstance(snake_case_   ,      snake_case_							)

										A__       :     Tuple								=			key or self.__key or 1

										# make sure key is an appropriate size
										key %= 255

										return [chr(ord(snake_case_							) ^ key							) for ch in content]





			def 		lowerCamelCase					(			self   ,      snake_case_   ,      snake_case_ = 0							):







										'''simple docstring'''


										assert isinstance(snake_case_   ,      snake_case_							) and isinstance(snake_case_   ,      snake_case_							)

										A__       :     List[str]								=			key or self.__key or 1

										# make sure key can be any size
										while key > 255:
																	key -= 255

										# This will be returned
										A__       :     Any								=			""""""

										for ch in content:
																	ans += chr(ord(snake_case_							) ^ key							)

										return ans





			def 		lowerCamelCase					(			self   ,      snake_case_   ,      snake_case_ = 0							):







										'''simple docstring'''


										assert isinstance(snake_case_   ,      snake_case_							) and isinstance(snake_case_   ,      snake_case_							)

										A__       :     Tuple								=			key or self.__key or 1

										# make sure key can be any size
										while key > 255:
																	key -= 255

										# This will be returned
										A__       :     List[str]								=			""""""

										for ch in content:
																	ans += chr(ord(snake_case_							) ^ key							)

										return ans





			def 		lowerCamelCase					(			self   ,      snake_case_   ,      snake_case_ = 0							):







										'''simple docstring'''


										assert isinstance(snake_case_   ,      snake_case_							) and isinstance(snake_case_   ,      snake_case_							)

										try:
																	with open(snake_case_							) as fin, open("""encrypt.out"""   ,      """w+"""							) as fout:
																								# actual encrypt-process
																								for line in fin:
																															fout.write(self.encrypt_string(snake_case_   ,      snake_case_							)							)

										except OSError:
																	return False

										return True





			def 		lowerCamelCase					(			self   ,      snake_case_   ,      snake_case_							):







										'''simple docstring'''


										assert isinstance(snake_case_   ,      snake_case_							) and isinstance(snake_case_   ,      snake_case_							)

										try:
																	with open(snake_case_							) as fin, open("""decrypt.out"""   ,      """w+"""							) as fout:
																								# actual encrypt-process
																								for line in fin:
																															fout.write(self.decrypt_string(snake_case_   ,      snake_case_							)							)

										except OSError:
																	return False

										return True


# Tests
# crypt = XORCipher()
# key = 67

# # test encrypt
# print(crypt.encrypt("hallo welt",key))
# # test decrypt
# print(crypt.decrypt(crypt.encrypt("hallo welt",key), key))

# # test encrypt_string
# print(crypt.encrypt_string("hallo welt",key))

# # test decrypt_string
# print(crypt.decrypt_string(crypt.encrypt_string("hallo welt",key),key))

# if (crypt.encrypt_file("test.txt",key)):
#       print("encrypt successful")
# else:
#       print("encrypt unsuccessful")

# if (crypt.decrypt_file("encrypt.out",key)):
#       print("decrypt successful")
# else:
#       print("decrypt unsuccessful")






"""simple docstring"""



from collections import defaultdict
class 						__UpperCAmelCase    :







			'''simple docstring'''





			def __init__(			self   ,      snake_case_   ,      snake_case_							):







										'''simple docstring'''


										A__       :     Tuple								=			total  # total no of tasks (N)

										# DP table will have a dimension of (2^M)*N
										# initially all values are set to -1
										A__       :     Optional[int]								=			[
										    [-1 for i in range(total + 1							)] for j in range(2 ** len(snake_case_							)							)
										]

										A__       :     Optional[int]								=			defaultdict(snake_case_							)  # stores the list of persons for each task

										# final_mask is used to check if all persons are included by setting all bits
										# to 1
										A__       :     Optional[int]								=			(1 << len(snake_case_							)) - 1





			def 		lowerCamelCase					(			self   ,      snake_case_   ,      snake_case_							):







										'''simple docstring'''


										if mask == self.final_mask:
																	return 1

										# if not everyone gets the task and no more tasks are available, return 0
										if task_no > self.total_tasks:
																	return 0

										# if case already considered
										if self.dp[mask][task_no] != -1:
																	return self.dp[mask][task_no]

										# Number of ways when we don't this task in the arrangement
										A__       :     Optional[int]								=			self.count_ways_until(snake_case_   ,      task_no + 1							)

										# now assign the tasks one by one to all possible persons and recursively
										# assign for the remaining tasks.
										if task_no in self.task:
																	for p in self.task[task_no]:
																								# if p is already given a task
																								if mask & (1 << p):
																															continue

																								# assign this task to p and change the mask value. And recursively
																								# assign tasks with the new mask value.
																								total_ways_util += self.count_ways_until(mask | (1 << p)   ,      task_no + 1							)

        # save the value.
										A__       :     List[str]								=			total_ways_util

										return self.dp[mask][task_no]





			def 		lowerCamelCase					(			self   ,      snake_case_							):







										'''simple docstring'''


										for i in range(len(snake_case_							)							):
																	for j in task_performed[i]:
																								self.task[j].append(snake_case_							)

        # call the function to fill the DP table, final answer is stored in dp[0][1]
										return self.count_ways_until(0   ,      1							)


if __name__ == "__main__":
				_UpperCamelCase								=		5  # total no of tasks (the value of N)

				# the list of tasks that can be done by M persons.
				_UpperCamelCase								=		[[1, 3, 4], [1, 2, 5], [3, 4]]
				print(
				    AssignmentUsingBitmask(task_performed, total_tasks).count_no_of_ways(
				        task_performed
				    )
				)





