import java.io.*;
import java.util.*;
public class Main{
static boolean visited[][];
static int count, N;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
count=0;
//자바에서 boolean 배열을 생성하는 경우에 false값을 초기화되어있다!!
visited = new boolean[N][N];
dfs(visited, 0);
System.out.println(count);
}
public static void dfs(boolean [][]visited, int depth){
//이전까지의 n&m에서는 여기서 출력을 진행해줬지만 이번에는 숫자를 세는 게 포인트이기때문에 연산만.
if(depth==N){
count++;
return;
}
//기본적인 재귀를 사용하는 방식이고,
for (int i = 0; i < N; i++) {
if(fQueen(visited, depth, i)){
visited[depth][i] = true;
dfs(visited, depth+1);
visited[depth][i] = false;
}
}
}
public static boolean fQueen(boolean[][] visited, int x, int y){
//현재 점에서부터 세로를 검사해주고,
for (int i = 0; i < x; i++) {
if(visited[i][y] == true)
return false;
}
//와! for문 안에 변수를 2개나 넣어서 할 수도 있다는 사실!!!!
//원래는 이중for문써서 해볼려고하니까 그렇게 하기는 시간초과일꺼같기도하고 애초에 틀리기도해서
//이부분은 검색해봤더니 for문 안에 변수를 2개를 넣어서 해본사람이 많았다!!
//위로 대각선 검사해주고,
for (int i=x, j=y; i>=0&&j>=0; i--, j--) {
if(visited[i][j] == tru1e)
return false;
}
//아래로 대각선 검사해주고,
for (int i=x, j=y; i>=0&&j<N; i--, j++) {
if(visited[i][j] == true)
return false;
}
return true;
}
}