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:
The number at the ith position is divisible by i.
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:
N is a positive integer and will not exceed 15.
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;
}
}