> For the complete documentation index, see [llms.txt](https://mayanktyagi3111.gitbook.io/interview-prep/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mayanktyagi3111.gitbook.io/interview-prep/dynamic-programming/beautiful-arrangement.md).

# Beautiful Arrangement

Suppose you have **N** integers from 1 to N. We define a beautiful arrangement as an array that is constructed by these **N** numbers successfully if one of the following is true for the ith position (1 <= i <= N) in this array:

1. The number at the ith position is divisible by **i**.
2. **i** is divisible by the number at the ith position.

Now given N, how many beautiful arrangements can you construct?

**Example 1:**

```
Input: 2
Output: 2
Explanation: 

The first beautiful arrangement is [1, 2]:

Number at the 1st position (i=1) is 1, and 1 is divisible by i (i=1).

Number at the 2nd position (i=2) is 2, and 2 is divisible by i (i=2).

The second beautiful arrangement is [2, 1]:

Number at the 1st position (i=1) is 2, and 2 is divisible by i (i=1).

Number at the 2nd position (i=2) is 1, and i (i=2) is divisible by 1.
```

**Note:**

1. **N** is a positive integer and will not exceed 15.

```java
class Solution {
    // Just try every possible number at each position
    public int countArrangement(int N) {
        char[] currState = new char[N + 1];
        Arrays.fill(currState, 'f'); // f means not selected, t means selected
        return helper(new HashMap<String, Integer>(), currState, 1);
    }

    public int helper(Map<String, Integer> map, char[] currState, int index) {
        if (index == currState.length)
            return 1;
        String key = String.valueOf(currState);
        if (map.containsKey(key))
            return map.get(key);
        int count = 0;
        for (int i = 1; i < currState.length; i++) {
            if (currState[i] == 'f' && (i % index == 0 || index % i == 0)) {
                currState[i] = 't';
                count += helper(map, currState, index + 1);
                currState[i] = 'f';
            }
        }
        map.put(key, count);
        return count;
    }
}
```
