# Solving Leetcode Interviews in Seconds with AI: Special Permutations


	# Introduction
	In this blog post, we will explore how to solve the LeetCode problem "2741" 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
	> You are given a 0-indexed integer array nums containing n distinct positive integers. A permutation of nums is called special if:  For all indexes 0 <= i < n - 1, either nums[i] % nums[i+1] == 0 or nums[i+1] % nums[i] == 0.  Return the total number of special permutations. As the answer could be large, return it modulo 109 + 7.   Example 1:  Input: nums = [2,3,6] Output: 2 Explanation: [3,6,2] and [2,6,3] are the two special permutations of nums.  Example 2:  Input: nums = [1,4,3] Output: 2 Explanation: [3,1,4] and [4,1,3] are the two special permutations of nums.    Constraints:  2 <= nums.length <= 14 1 <= nums[i] <= 109  

	# Explanation
	Here's the solution:

*   **Dynamic Programming with Bitmasking:** Use a bitmask to represent which numbers have been used in the permutation so far. Store the count of special permutations ending at each number with a corresponding bitmask.
*   **Iterative Construction:** Build the permutations iteratively, starting from a single element and adding elements one by one while maintaining the special permutation property.
*   **Modulo Arithmetic:** Apply modulo operation (10<sup>9</sup> + 7) at each step to prevent overflow.

*   **Runtime Complexity:** O(n * 2<sup>n</sup>), where n is the number of elements in `nums`.
*   **Storage Complexity:** O(n * 2<sup>n</sup>)

	
	# Code
	```python
	def specialPerm(nums):
    n = len(nums)
    dp = {}
    MOD = 10**9 + 7

    def solve(mask, last):
        if mask == (1 << n) - 1:
            return 1

        if (mask, last) in dp:
            return dp[(mask, last)]

        ans = 0
        for i in range(n):
            if (mask >> i) & 1 == 0:
                if last == -1 or nums[i] % nums[last] == 0 or nums[last] % nums[i] == 0:
                    ans = (ans + solve(mask | (1 << i), i)) % MOD

        dp[(mask, last)] = ans
        return ans

    return solve(0, -1)
	```
			
