# Solving Leetcode Interviews in Seconds with AI: Number of Ways to Wear Different Hats to Each Other


	# Introduction
	In this blog post, we will explore how to solve the LeetCode problem "1434" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like [Chatmagic](https://www.chatmagic.app), we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.

	# Problem Statement
	> There are n people and 40 types of hats labeled from 1 to 40. Given a 2D integer array hats, where hats[i] is a list of all hats preferred by the ith person. Return the number of ways that n people can wear different hats from each other. Since the answer may be too large, return it modulo 109 + 7.   Example 1:  Input: hats = [[3,4],[4,5],[5]] Output: 1 Explanation: There is only one way to choose hats given the conditions.  First person choose hat 3, Second person choose hat 4 and last one hat 5.  Example 2:  Input: hats = [[3,5,1],[3,5]] Output: 4 Explanation: There are 4 ways to choose hats: (3,5), (5,3), (1,3) and (1,5)  Example 3:  Input: hats = [[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]] Output: 24 Explanation: Each person can choose hats labeled from 1 to 4. Number of Permutations of (1,2,3,4) = 24.    Constraints:  n == hats.length 1 <= n <= 10 1 <= hats[i].length <= 40 1 <= hats[i][j] <= 40 hats[i] contains a list of unique integers.  

	# Explanation
	Here's a solution to the hat assignment problem.

*   **High-Level Approach:** Dynamic programming with bit masking. We iterate through each hat type (1 to 40). For each hat, we consider all possible subsets of people who can wear that hat. The DP state `dp[hat_id][mask]` represents the number of ways to assign hats 1 to `hat_id` to the people represented by the bitmask `mask`.
*   **Complexity:** O(40 * 2<sup>n</sup> * n), where n is the number of people. Storage Complexity is O(40 * 2<sup>n</sup>).
*   **Code:**

	
	# Code
	```python
	def numberWays(hats):
    n = len(hats)
    hat_to_people = [[] for _ in range(41)]
    for i in range(n):
        for hat in hats[i]:
            hat_to_people[hat].append(i)

    dp = [[0] * (1 << n) for _ in range(41)]
    dp[0][0] = 1
    mod = 10**9 + 7

    for hat_id in range(1, 41):
        for mask in range(1 << n):
            dp[hat_id][mask] = dp[hat_id - 1][mask]  # Don't use the current hat
            for person in hat_to_people[hat_id]:
                if (mask & (1 << person)):
                    dp[hat_id][mask] += dp[hat_id - 1][mask ^ (1 << person)]
                    dp[hat_id][mask] %= mod

    return dp[40][(1 << n) - 1]
	```
			
