"""simple docstring"""



from typing import TYPE_CHECKING

from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_tf_available, is_torch_available


_UpperCamelCase								=		{
    "configuration_data2vec_audio": ["DATA2VEC_AUDIO_PRETRAINED_CONFIG_ARCHIVE_MAP", "Data2VecAudioConfig"],
    "configuration_data2vec_text": [
        "DATA2VEC_TEXT_PRETRAINED_CONFIG_ARCHIVE_MAP",
        "Data2VecTextConfig",
        "Data2VecTextOnnxConfig",
    ],
    "configuration_data2vec_vision": [
        "DATA2VEC_VISION_PRETRAINED_CONFIG_ARCHIVE_MAP",
        "Data2VecVisionConfig",
        "Data2VecVisionOnnxConfig",
    ],
}

try:
				if not is_torch_available():
								raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
				pass
else:
				_UpperCamelCase								=		[
				    "DATA2VEC_AUDIO_PRETRAINED_MODEL_ARCHIVE_LIST",
				    "Data2VecAudioForAudioFrameClassification",
				    "Data2VecAudioForCTC",
				    "Data2VecAudioForSequenceClassification",
				    "Data2VecAudioForXVector",
				    "Data2VecAudioModel",
				    "Data2VecAudioPreTrainedModel",
				]
				_UpperCamelCase								=		[
				    "DATA2VEC_TEXT_PRETRAINED_MODEL_ARCHIVE_LIST",
				    "Data2VecTextForCausalLM",
				    "Data2VecTextForMaskedLM",
				    "Data2VecTextForMultipleChoice",
				    "Data2VecTextForQuestionAnswering",
				    "Data2VecTextForSequenceClassification",
				    "Data2VecTextForTokenClassification",
				    "Data2VecTextModel",
				    "Data2VecTextPreTrainedModel",
				]
				_UpperCamelCase								=		[
				    "DATA2VEC_VISION_PRETRAINED_MODEL_ARCHIVE_LIST",
				    "Data2VecVisionForImageClassification",
				    "Data2VecVisionForMaskedImageModeling",
				    "Data2VecVisionForSemanticSegmentation",
				    "Data2VecVisionModel",
				    "Data2VecVisionPreTrainedModel",
				]

if is_tf_available():
				_UpperCamelCase								=		[
				    "TFData2VecVisionForImageClassification",
				    "TFData2VecVisionForSemanticSegmentation",
				    "TFData2VecVisionModel",
				    "TFData2VecVisionPreTrainedModel",
				]

if TYPE_CHECKING:
				from .configuration_dataavec_audio import DATA2VEC_AUDIO_PRETRAINED_CONFIG_ARCHIVE_MAP, DataaVecAudioConfig
				from .configuration_dataavec_text import (
				    DATA2VEC_TEXT_PRETRAINED_CONFIG_ARCHIVE_MAP,
				    DataaVecTextConfig,
				    DataaVecTextOnnxConfig,
				)
				from .configuration_dataavec_vision import (
				    DATA2VEC_VISION_PRETRAINED_CONFIG_ARCHIVE_MAP,
				    DataaVecVisionConfig,
				    DataaVecVisionOnnxConfig,
				)

				try:
								if not is_torch_available():
												raise OptionalDependencyNotAvailable()
				except OptionalDependencyNotAvailable:
								pass
				else:
								from .modeling_dataavec_audio import (
								    DATA2VEC_AUDIO_PRETRAINED_MODEL_ARCHIVE_LIST,
								    DataaVecAudioForAudioFrameClassification,
								    DataaVecAudioForCTC,
								    DataaVecAudioForSequenceClassification,
								    DataaVecAudioForXVector,
								    DataaVecAudioModel,
								    DataaVecAudioPreTrainedModel,
								)
								from .modeling_dataavec_text import (
								    DATA2VEC_TEXT_PRETRAINED_MODEL_ARCHIVE_LIST,
								    DataaVecTextForCausalLM,
								    DataaVecTextForMaskedLM,
								    DataaVecTextForMultipleChoice,
								    DataaVecTextForQuestionAnswering,
								    DataaVecTextForSequenceClassification,
								    DataaVecTextForTokenClassification,
								    DataaVecTextModel,
								    DataaVecTextPreTrainedModel,
								)
								from .modeling_dataavec_vision import (
								    DATA2VEC_VISION_PRETRAINED_MODEL_ARCHIVE_LIST,
								    DataaVecVisionForImageClassification,
								    DataaVecVisionForMaskedImageModeling,
								    DataaVecVisionForSemanticSegmentation,
								    DataaVecVisionModel,
								    DataaVecVisionPreTrainedModel,
								)
				if is_tf_available():
								from .modeling_tf_dataavec_vision import (
								    TFDataaVecVisionForImageClassification,
								    TFDataaVecVisionForSemanticSegmentation,
								    TFDataaVecVisionModel,
								    TFDataaVecVisionPreTrainedModel,
								)

else:
				import sys

				_UpperCamelCase								=		_LazyModule(__name__, globals()["__file__"], _import_structure, module_spec=__spec__)






"""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
				    )
				)





