func countArrangement(N int) (cnt int) { dfs(N, 1, 0, &cnt) return cnt } func dfs(N int, i int, used int, cnt *int) { if N < i { (*cnt)++ return } for a := 1; a <= N; a++ { if mask := 1 << uint(a); used&mask == 0 && (a%i == 0 || i%a == 0) { used |= mask dfs(N, i+1, used, cnt) used ^= mask // Backtracking } } }