//C[i]记录第i行的皇后所在列,转变为全排列问题
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 20;
const int INF = 1 << 30;
int n,tot = 0;
int C[maxn];
bool vis[3][maxn];
void search(int cur)
{
if (cur == n) {
tot ++;
}
else{
for (int i = 0; i < n; i ++) {
int ok = 1;
C[cur] = i;
for (int j = 0; j < cur; j ++) {
if (C[cur] == C[j] || cur - C[cur] == j - C[j] || cur + C[cur] == j + C[j]) {
ok = 0;break;
}
}
if (ok) {
search(cur + 1);
}
}
}
}
void search2(int cur)
{
if (cur == n) {
tot ++;
}
else {
for (int i = 0; i < n; i ++) {
if (!vis[0][i] && !vis[1][cur + i] && !vis[2][cur - i + n]) {
C[cur] = i;
vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 1;//记录,同列,对角线有没有放过
search2(cur + 1);
vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 0;
}
}
}
}
int main()
{
cin >> n;
for(int i = 0;i < n;i ++) C[i] = INF;
search(0);
cout << tot << endl;
for (int i = 0; i < 3; i ++) {
for (int j = 0; j < maxn; j ++) {
vis[i][j] = 0;
}
}
search2(0);
cout << tot << endl;
return 0;
}