#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
using namespace std;
class Queue{
friend int nQueue(int n);
private:
bool Place(int j); //判断第j行和前面已经填入的行是否有冲突
void traceback();
int n;
long amount;
int *x; //x[i]代表第i行皇后所在位置
};
bool Queue::Place(int j){
for(int i = 1 ;i < j;i++)
if(abs(i-j)==abs(x[i] - x[j]) || x[i] == x[j])
return false;
return true;
}
void Queue::traceback(){
int k = 1;
x[k] = 0;
while(k > 0){
x[k]++;
while(x[k] <= n && !Place(k)) x[k]++;//找到第一个满足位置的皇后位置
if(x[k] <= n){
if(k == n) //如果走到第n行,方案数加一
amount++;
else{
k++; // 如果不是第n行 ,就进入下一行
x[k] = 0; //列需要从0开始重新判断
}
}else k--;//如果 x[k] > n,说明上一行的位置重新改变,返回上一行
}
}
int nQueue(int nq){
Queue T;
int *p = new int[nq+1];
memset(p,0,sizeof p);
T.x = p;
T.amount = 0;
T.n = nq;
T.traceback();
delete[]p;
return T.amount;
}
int main(){
int n;
cin>>n;
cout<<nQueue(n)<<endl;
}